为了账号安全,请及时绑定邮箱和手机立即绑定

多线程基础问题 谢谢!!!

多线程基础问题 谢谢!!!

慕姐8946757 2017-08-10 05:47:18
public class TicketThread implements Runnable { static int tickets = 100;// 火车票数量 Object obj = new Object(); @Override public void run() { // 出售火车票 while (true) { /* * synchronized (obj) { method(); } */ method(); // method2(); } } private synchronized void method() { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + tickets--); } }请问这段代码中的if (tickets > 0) 能否改成if (tickets<= 0){break;} 改完后打印的有负数 ,是什么问题呢?
查看完整描述

2 回答

已采纳
?
言曌博客liuyanzhao_com

TA贡献164条经验 获得超117个赞

public class TicketThread implements Runnable {
   static int tickets = 100;// 火车票数量
   Object obj = new Object();
   
   @Override
   public void run() {
      // 出售火车票
      while (tickets>0) {
         method();
      }
      
   }
   
    private  void method() {
      if (tickets > 0) {
         System.out.println(Thread.currentThread().getName() + ":" + tickets--);
         try {
            Thread.sleep(100);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
   
   
   public static void main(String[] args) {
      TicketThread ticketThread = new TicketThread();
      
      Thread t1 = new Thread(ticketThread,"甲站台");
      Thread t2 = new Thread(ticketThread,"乙站台");
      Thread t3 = new Thread(ticketThread,"丙站台");
      Thread t4 = new Thread(ticketThread,"丁站台");
      
      t1.start();
      t2.start();
      t3.start();
      t4.start();
      
   }
}

之所以出现负数票,我的解释如下。

当票数为1的时候,有 多个线程通过了 if 判断语句,然后在休眠,没有继续往下执行,以至于 tickets 的数量在段时间还是 1,线程唤醒后,继续往下执行,接着打印票的信息。就会出现 -1,-2 之类的票了。

解决方案:我们把 打印票的语句和tickets-- 的放到 sleep 前面去即可

查看完整回答
反对 回复 2017-08-10
  • 慕姐8946757
    慕姐8946757
    请问这段代码中的if (tickets > 0) 能否改成if (tickets<= 0){break;} 为什么????
  • 慕姐8946757
    慕姐8946757
    我就想问这段代码中的判断语句能不能改成if (tickets<= 0){break;} 为什么不可以?
  • 言曌博客liuyanzhao_com
    言曌博客liuyanzhao_com
    肯定不行啊,会出现 ERROR 的。break 一般是用来结束循环 的,method 方法里又没有 while 语句,怎么结束了。你用编辑器的时候,可以看到 break; 旁边有个小红叉的,表示 无法通过编译
点击展开后面2
  • 2 回答
  • 0 关注
  • 1132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信