猿问

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

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;} 改完后打印的有负数 ,是什么问题呢?


慕姐8946757
浏览 1133回答 2
2回答

言曌博客liuyanzhao_com

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 前面去即可
随时随地看视频慕课网APP

相关分类

Java
我要回答