static tickets seller=new tickets();这个样定义
输出结果:
赵先生稍等
周先生完成售票
李先生完成售票
找给孙先生一张5元,完成售票
找给钱先生一张10元和一张5元,完成售票
找给赵先生一张10元,完成售票
Process finished with exit code 0
tickets seller=new tickets();找个样定义
输出结果:
钱先生稍等一下
赵先生稍等
找给孙先生一张5元,完成售票
周先生完成售票
李先生完成售票
为什么会陷入死锁?
package Test04.test3;
/*
题目:
编写Java应用程序模拟5个人排队买票。售票员只有1张五元的钱,电影票五元钱一张。假设5个人的名字及排队顺序是:
赵、钱、孙、李、周。“赵”拿1张二十元的人民币买2张票,“钱”拿1张二十元的人民币买1张票,“孙”1张十元的人民币买1张票,
“李”拿1张十元的人民币买2张票,“周”拿1张五元的人民币买1张票。
要求售票员按如下规则找赎:
(1)二十元买2张票,找零:1张十元;不许找零2张五元。
(2)二十元买1张票,找零:1张十元,1张五元;不许找零3张五元。
(3)十元买一张票,找零1张五元。
*/
class tickets{
//售票手机钱的个数
static int fiveNumber=1,tenNumber=0,twentyNumber=0;
//买票人的钱和需要票数;
public synchronized void check(int money,int count) {
String name=Thread.currentThread().getName();
//买2张票,付20元,应找回一张10元
if(money==20&&count==2){
twentyNumber++;//先将钱收下
if(tenNumber<1){
try {
System.out.println(name+"稍等");
this.wait();
} catch (InterruptedException e) {
System.out.println("有内鬼,终止交易");
}
}//钱不够就让他等一会
while(tenNumber<1) {
try {
this.wait();
} catch (InterruptedException e) {System.out.println("有内鬼,终止交易");}
}//,之后的没有办法成功找钱,就继续进入等待状态
tenNumber--;//找钱
System.out.println("找给"+name+"一张10元,完成售票");
notify();
}
else if(money==20&&count==1){
//买一张票,付20元
twentyNumber++;
if(tenNumber<1||fiveNumber<1){
try {
System.out.println(name+"稍等一下");
this.wait();
} catch (InterruptedException e) {System.out.println("有内鬼,终止交易");}
}
while(tenNumber<1||fiveNumber<1) {
try {
this.wait();
} catch (InterruptedException e) {System.out.println("有内鬼,终止交易");}
}//,之后的没有办法成功找钱,就继续进入等待状态
tenNumber--;
fiveNumber--;
System.out.println("找给"+name+"一张10元和一张5元,完成售票");
notify();
}
else if(money==10&&count==1){
tenNumber++;
if(fiveNumber<1){
try {
System.out.println(name+"稍等一下");
this.wait();
} catch (InterruptedException e) {System.out.println("有内鬼,终止交易");}
}
while(fiveNumber<1) {
try {
this.wait();
} catch (InterruptedException e) {System.out.println("有内鬼,终止交易");}
}//没有办法成功找钱,就继续进入等待状态
fiveNumber--;
System.out.println("找给"+name+"一张5元,完成售票");
notify();
}
else if(money==10&&count==2){
tenNumber++;
System.out.println(name+"完成售票");
notify();
}
else if(money==5&&count==1){
fiveNumber++;
System.out.println(name+"完成售票");
notify();
}
}
}
public class buyTicket implements Runnable{
static tickets seller=new tickets();
public void run() {
synchronized (this.seller){
if (Thread.currentThread().getName().equals("赵先生")){
seller.check(20,2);
}
else if(Thread.currentThread().getName().equals("钱先生")){
seller.check(20,1);
}
else if(Thread.currentThread().getName().equals("孙先生")){
seller.check(10,1);
}
else if(Thread.currentThread().getName().equals("李先生")){
seller.check(10,2);
}
else if(Thread.currentThread().getName().equals("周先生")){
seller.check(5,1);
}
}
}
public static void main(String[] args) {
new Thread(new buyTicket(),"赵先生").start();
new Thread(new buyTicket(),"钱先生").start();
new Thread(new buyTicket(),"孙先生").start();
new Thread(new buyTicket(),"李先生").start();
new Thread(new buyTicket(),"周先生").start();
}
}
/*
static tickets seller=new tickets();
赵先生稍等
周先生完成售票
李先生完成售票
找给孙先生一张5元,完成售票
找给钱先生一张10元和一张5元,完成售票
找给赵先生一张10元,完成售票
Process finished with exit code 0
*/
/*
tickets seller=new tickets();
钱先生稍等一下
赵先生稍等
找给孙先生一张5元,完成售票
周先生完成售票
李先生完成售票
*/