素人程序猿 2015-12-13 07:25 采纳率: 50%
浏览 1438

Java中同步线程不是应该先中断先继续吗,为什么我的没有?求大神指点

代码如下:
public class BuyTicketMain {

       public static void main(String args[ ]) {
          TicketHouse officer = new TicketHouse();
          Thread zhangfei,likui,wangwu;
          zhangfei = new Thread(officer); 
          zhangfei.setName("张飞");
          likui = new Thread(officer);  
          likui.setName("李逵");
          wangwu =new Thread(officer);
          wangwu.setName("王五");
          wangwu.start();
          zhangfei.start();
          likui.start();
       }

}
代码2:import java.util.Scanner;

public class TicketHouse implements Runnable {
int fiveAmount=2,tenAmount=0,twentyAmount=0,n=0;
public synchronized void run() {
/* if(Thread.currentThread().getName().equals("张飞")) {
saleTicket(20);
}
else if(Thread.currentThread().getName().equals("李逵")) {
saleTicket(5);
}*/
System.out.println(Thread.currentThread().getName()+"买票"+Thread.currentThread().getName()+"有多少钱?(输入金额,只能为5,20)");
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
saleTicket(n);
}
private synchronized void saleTicket(int money) {
if(money==5) { //如果使用该方法的线程传递的参数是5,就不用等待
fiveAmount=fiveAmount+1;
System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"的钱正好");
}
else if(money==20) {

while(fiveAmount<3) {
try { System.out.println("\n"+Thread.currentThread().getName()+"靠边等...");
wait(); //如果使用该方法的线程传递的参数是20须等待
//Thread.sleep(1000);
System.out.println("\n"+Thread.currentThread().getName()+"继续买票");
}
catch(InterruptedException e){}
}
fiveAmount=fiveAmount-3;
twentyAmount=twentyAmount+1;
System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
Thread.currentThread().getName()+"给20,找赎15元");
}
notifyAll();
}
}
下图中张飞不应该在王五之后就可以买票吗?为什么要等李逵买了之后才能继续买票?求大神指点
图片说明

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2015-12-13 07:50
    关注

    可能是线程优先级问题,王五线程启动后占据锁后,李逵线程可能先于张飞线程先执行了。多线程环境下线程的执行顺序可能跟代码中开启的顺序不一致。你可以打印下每个线程的执行时间看看。

    评论

报告相同问题?

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services