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 前面去即可
添加回答
举报
0/150
提交
取消