「模拟排队java」模拟排队数据结构
本篇文章给大家谈谈模拟排队java,以及模拟排队数据结构对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
用C或java编写排队服务程序
这个简单。
先做几个实体
客户,售货员,
客户包括到达时间,完成目标需要的时间,开始操作的时间,结束的时间。
售货员包括当前正在服务的客户,
开2个线程。一个是客户产生线程。
一个是售货员消费线程
中间用个公共寄存体queue。
客户产生线程每次产生一个带到达时间,完成目标时间的客户。
放倒队列里,并提醒售货员线程接收。
售货员线程空置则从队列里拿一个客户,当前时间=当前时间和客户到达的时间最大的一个。客户的开始操作时间=当前时间
结束时间=当前时间+需要时间。
处理完以后当前时间=结束时间。
如果队列空,售货员线程等待。
不为空就继续取。
注意所有处理过的客户都需要放到一个List里。
然后这一天结束了,就把整个List里的客户全部取出来,就算平均等待时间,各种时间。。。。这个会统计的吧。
要求追分
高分求JAVA高手帮忙
public class Buy{
Object seller=new Object();
int twantyNumber=0;
int tenNumber=0;
int fiveNumber=1;
int all=5;
public Buy(){
printmony();
buyer zhao=new buyer("赵",2,20);
buyer qian=new buyer("钱",1,20);
buyer sun=new buyer("孙",1,10);
buyer li=new buyer("李",2,10);
buyer zhou=new buyer("周",1,5);
zhao.start();
qian.start();
sun.start();
li.start();
zhou.start();
}
class buyer extends Thread{
int number=0;
int mony=0;
String name=null;
boolean hasBuyed=false;
public buyer(String name,int number,int mony) {
this.number=number;
this.mony=mony;
this. name=name;
}
void print(int i){
if(i==0){System.out.println(name+" 正在买 "+number+" 张票 "+ mony+ "元钱");
}
if(i==1){System.out.println(name+" 已经买完 !");
printmony();
}
}
public void run(){
while(!hasBuyed){
synchronized (seller) {
int charge=mony-number*5;
if((tenNumber=charge/10fiveNumber=(charge%10)/5)||charge==0){
print(0);
if(mony==20)twantyNumber++;
if(mony==10)tenNumber++;
if(mony==5)fiveNumber++;
tenNumber-=charge/10;
fiveNumber-=(charge%10)/5;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
print(1);
hasBuyed=true;
seller.notifyAll();
}else{
try {
seller.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
void printmony(){
System.out.println("\t 售票员的钱数:");
System.out.println("\t\t\t20元\t10元\t五元");
System.out.println("\t\t\t"+twantyNumber+"张\t"+tenNumber+"张\t"+fiveNumber+"张");
}
public static void main(String[] s){
new Buy();
}
}
结果:
售票员的钱数:
20元 10元 五元
0张 0张 1张
孙 正在买 1 张票 10元钱
孙 已经买完 !
售票员的钱数:
20元 10元 五元
0张 1张 0张
赵 正在买 2 张票 20元钱
赵 已经买完 !
售票员的钱数:
20元 10元 五元
1张 0张 0张
周 正在买 1 张票 5元钱
周 已经买完 !
售票员的钱数:
20元 10元 五元
1张 0张 1张
李 正在买 2 张票 10元钱
李 已经买完 !
售票员的钱数:
20元 10元 五元
1张 1张 1张
钱 正在买 1 张票 20元钱
钱 已经买完 !
售票员的钱数:
20元 10元 五元
2张 0张 0张
java高手帮帮忙!!急!
---------------------TicketBuyer.java---------------------------
public class TicketBuyer extends Thread {
private int money;
private TicketSeller ticketSeller;
public TicketBuyer(){
}
//构造函数,设置手中钱币值及向哪个售票员买票
public TicketBuyer(int money,TicketSeller ticketSeller){
this.money = money;
this.ticketSeller = ticketSeller;
}
public void run(){
ticketSeller.sellTicket(money);//每个人都买票
}
public static void main(String[] args) {
// TODO 自动生成方法存根
TicketSeller ticketSeller = new TicketSeller();
TicketBuyer Zhang = new TicketBuyer(20,ticketSeller);
TicketBuyer Sun = new TicketBuyer(10,ticketSeller);
TicketBuyer Zhao = new TicketBuyer(5,ticketSeller);
//注以下要设置优先级别是因为他们本来就是排好队的, 先来先买到票
//这样才能保证每次运行先买到票的是拿10元的孙某而不是赵某
Zhang.setPriority(6);
Sun.setPriority(5);
Zhao.setPriority(4);
Zhang.start();
Sun.start();
Zhao.start();
}
}
------------TicketSeller.java-------------------------
public class TicketSeller {
private int fiveNumber = 1;//开始时只有一张5元的钱.
private int tenNumber = 0;
private int twentyNumber = 0;
public synchronized void sellTicket(int receiveMoney) {
if(!isAbleToSell(receiveMoney)){//测下能不能够售票.
try{
wait();//如果不能卖给当前人,那人就得等一会.
}catch(InterruptedException e){
}
}
//只有能够售票的人(线程)才会执行下面的代码.
switch(receiveMoney){//有几种情况
case 5 :fiveNumber ++;break; //不用找零钱
case 10 :tenNumber ++ ;fiveNumber--;break;//要找5元零钱
case 20 :if (tenNumber 0 ){//如果有10元面币的就找10元和5元的
tenNumber --;
fiveNumber --;
twentyNumber ++;
}else{//要没有10元的,那就找回3张5元的
fiveNumber -=3;
twentyNumber ++;
}
break;
}
System.out.printf("当收到钱为:%d元时,售票成功!\n",receiveMoney);//输出信息
notify();//可以叫等着的那个人买票了.
}
//有几种情况看能不能售票,这里你应该能看明白就不多说了.
public boolean isAbleToSell(int money){
if(money == 5 ){
return true;
}else if(money == 10 fiveNumber 0 ){
return true;
}else if(money == 20 tenNumber 0 fiveNumber 0){
return true;
}else if(money == 20 fiveNumber = 3){
return true;
}
return false;
}
}
-------- 运行结果: ---------------------
当收到钱为:10元时,售票成功!
当收到钱为:5元时,售票成功!
当收到钱为:20元时,售票成功!
用java实现银行排队程序,要求模拟银行的业务排队系统,要有界面,实现完成的排队和叫号
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class BankWaiting extends JFrame implements ActionListener {
int total = 0, now = 0;
boolean is1Ready = false, is2Ready = false, is3Ready = false;
int call1, call2, call3;
JFrame jf;
JLabel jr, jl, jl1, j2, jl2, j3, jl3;
JTextField jr4;
JButton jb, jb1, jb2, j1;
JButton workBut1, workBut2, workBut3;
JPanel jp, jp1, jp2;
public BankWaiting() {
setLayout(null);
jf = new JFrame("银行叫号程序");// 窗体
jr = new JLabel("请**号到*号窗口办理业务");
jr.setBounds(300, 10, 800, 50);
jr.setForeground(Color.red);
j1 = new JButton("取号");
j1.addActionListener(this);
jr4 = new JTextField("欢迎");
jr4.setEditable(false);
ButtonGroup bg = new ButtonGroup();
bg.add(j1);
jp = new JPanel();
jl = new JLabel("一号窗口");
jl1 = new JLabel("一号窗口,欢迎你!");
jb = new JButton("下一位");
workBut1 = new JButton("开始办理");
workBut1.addActionListener(this);
jb.addActionListener(this);
jp.setBackground(Color.pink);
jp.setSize(200, 80);// 大小
jp.setLocation(20, 120); // 位置
jf.setLayout(null);
jp1 = new JPanel();
j2 = new JLabel("二号窗口");
jl2 = new JLabel("二号窗口,欢迎你!");
jb1 = new JButton("下一位");
workBut2 = new JButton("开始办理");
jb1.addActionListener(this);
workBut2.addActionListener(this);
jp1.setBackground(Color.pink);
jp1.setSize(200, 80);// 大小
jp1.setLocation(250, 120); // 位置
jf.setLayout(null);
jp2 = new JPanel();
j3 = new JLabel("三号窗口");
jl3 = new JLabel("三号窗口,欢迎你!");
jb2 = new JButton("下一位");
workBut3 = new JButton("开始办理");
workBut3.addActionListener(this);
jb2.addActionListener(this);
jp2.setBackground(Color.pink);
jp2.setSize(200, 80);// 大小
jp2.setLocation(500, 120); // 位置
jf.setLayout(null);
jf.add(jp);
jf.add(jp1);
jf.add(jp2);
jf.add(jr);
jp.add(jl);
jp.add(jl1);
jp.add(jb);
jp.add(workBut1);
jp1.add(j2);
jp1.add(jl2);
jp1.add(jb1);
jp1.add(workBut2);
jp2.add(j3);
jp2.add(jl3);
jp2.add(jb2);
jp2.add(workBut3);
jf.add(j1);
jf.add(jr4);
j1.setBounds(550, 300, 60, 30);
jr4.setBounds(300, 300, 200, 40);
jf.setSize(800, 600);
jf.setVisible(true);
jf.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e) {
String s = "";
if (e.getSource() == j1) {
s = "第" + (++total) + "号,前面还有" + (total - now - 1) + "位顾客!";
jr4.setText(s);
}
if (e.getSource() == jb) {
if (this.hasCustomers()) {
s = "请" + (++now) + "号顾客到一号窗口办理";
call1 = now;
jl1.setText(s);
jr.setText(s);
is1Ready = true;
} else {
s = "当前已经没有顾客了";
jl1.setText(s);
is1Ready = false;
}
} else if (e.getSource() == jb1) {
if (this.hasCustomers()) {
s = "请" + (++now) + "号顾客到二号窗口办理";
call2 = now;
jl2.setText(s);
jr.setText(s);
is2Ready = true;
} else {
s = "当前已经没有顾客了";
jl2.setText(s);
is2Ready = false;
}
} else if (e.getSource() == jb2) {
if (this.hasCustomers()) {
s = "请" + (++now) + "号顾客到三号窗口办理";
call3 = now;
jl3.setText(s);
jr.setText(s);
is3Ready = true;
} else {
s = "当前已经没有顾客了";
jl3.setText(s);
is3Ready = false;
}
}
if (e.getSource() == workBut1) {
if (is1Ready) {
s = call1 + "号顾客正在办理业务。。。";
jl1.setText(s);
is1Ready = false;
}
} else if (e.getSource() == workBut2) {
if (is2Ready) {
s = call2 + "号顾客正在办理业务。。。";
jl2.setText(s);
is2Ready = false;
}
} else if (e.getSource() == workBut3) {
if (is3Ready) {
s = call3 + "号顾客正在办理业务。。。";
jl3.setText(s);
is3Ready = false;
}
}
}
public boolean hasCustomers() {
if (now total) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
new BankWaiting();
}
}
模拟排队java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于模拟排队数据结构、模拟排队java的信息别忘了在本站进行查找喔。