黑马程序员技术交流社区

标题: 多线程同时卖票有不明白的地方 [打印本页]

作者: ぺsimon☆    时间: 2013-5-15 16:10
标题: 多线程同时卖票有不明白的地方
本帖最后由 ぺsimon☆ 于 2013-5-15 17:10 编辑
  1. /*
  2. 有100张票,4个窗口在同时卖票,用多线程实现
  3. */


  4. class Ticket implements Runnable
  5. {
  6.         //定义100张票
  7.         private int ticket=100;
  8.         
  9.         //覆盖run方法
  10.         public void run()
  11.         {
  12.         while(true)
  13.         {
  14.         
  15.         if(ticket>0)
  16.         {

  17.         if(ticket==1)
  18.         try{Thread.sleep(1000);}catch(Exception e){e.toString();}

  19.         System.out.println(ticket);
  20.         ticket=ticket-1;

  21.         /*
  22.         注意问题:System.out.println(ticket);
  23.                  ticket=ticket-1;

  24.         写成System.out.println(ticket--);有什么区别呢?好像写成ticket--会输出两个1,但是当分开写的时候
  25.         没有1出现了,这是为什么呢,不太明白?兄弟们帮帮忙
  26.         */
  27.         }

  28.         else
  29.         break;
  30.         }

  31.         }        
  32. }

  33. class TicketDemo
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.         Ticket t=new Ticket();

  38.         Thread t1=new Thread(t);
  39.         t1.start();

  40.         Thread t2=new Thread(t);
  41.         t2.start();
  42.         }
  43. }
复制代码

作者: 胡帅冰    时间: 2013-5-15 16:37
这两个写法没任何的区别,都是打印一下ticket 然后使ticket-1。出现两个1,或者不出现1,是在多线程运行过程中出现的安全问题。你再往后看到多线程的安全就知道了。你可以再多运行几次看看,不管哪种打印方法,两个1或者不出现1的现象都是会出现的。
作者: slatop@qq.com    时间: 2013-5-15 16:41
输出几个1和你现在的代码没关系。你没有做同步操作。所以有可能随机出来,一个1,或零个1,或是两个1.

注意问题:System.out.println(ticket);

28.                 ticket=ticket-1;

29.

30.        写成System.out.println(ticket--);


以上两种写法在此时是没有不同的。

所以你的问题在于线程同步问题没解决,并不在于代码有问题。线程同步的方法毕老师有讲继续向后看吧。我就不在这里说了挺长的。
不过可以告诉你ticket=ticket-1;
和ticket--的区别。ticket=ticket-1是先减一然后取值,等同于--ticket 而ticket--是先取值再减一。
作者: ぺsimon☆    时间: 2013-5-15 17:09
哦,我明白了谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2