A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-5-15 16:10  /  855 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ぺ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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

3 个回复

倒序浏览
这两个写法没任何的区别,都是打印一下ticket 然后使ticket-1。出现两个1,或者不出现1,是在多线程运行过程中出现的安全问题。你再往后看到多线程的安全就知道了。你可以再多运行几次看看,不管哪种打印方法,两个1或者不出现1的现象都是会出现的。
回复 使用道具 举报
输出几个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--是先取值再减一。
回复 使用道具 举报
哦,我明白了谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马