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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 woaiheima 于 2013-12-10 21:41 编辑
  1. class Ticket extends Thread
  2. {        private static int tick=100;
  3.         Ticket(String name)
  4.         {
  5.                 super(name);
  6.         }
  7.         public void run()
  8.         {
  9.                 while(true)
  10.                 {
  11.                         if (tick>0)
  12.                         {
  13.                                 System.out.println(Thread.currentThread().getName()+"卖了"+tick+"号票");
  14.                                 --tick;
  15.                         }
  16.                
  17.                 }
  18.         }
  19. }

  20. class TicketDemo
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 Ticket t1=new Ticket("1号窗口");
  25.                 Ticket t2=new Ticket("2号窗口");
  26.                 Ticket t3=new Ticket("3号窗口");
  27.                 Ticket t4=new Ticket("4号窗口");
  28.                 t1.start();
  29.                 t2.start();
  30.                 t3.start();
  31.                 t4.start();
  32.         }
  33. }
复制代码


我的win8系统Inter四核的电脑,JDK1.7,运行结果为什么有四个100号票啊???
4号窗口卖了100号
4号窗口卖了99号票
4号窗口卖了98号票
4号窗口卖了97号票
4号窗口卖了96号票
4号窗口卖了95号票
4号窗口卖了94号票
4号窗口卖了93号票
4号窗口卖了92号票
4号窗口卖了91号票
4号窗口卖了90号票
3号窗口卖了100号
2号窗口卖了100号
1号窗口卖了100号
2号窗口卖了87号票
3号窗口卖了88号票
4号窗口卖了89号票
3号窗口卖了84号票
2号窗口卖了85号票
1号窗口卖了86号票
2号窗口卖了81号票
3号窗口卖了82号票
4号窗口卖了83号票
3号窗口卖了78号票
2号窗口卖了79号票
1号窗口卖了80号票
2号窗口卖了75号票
3号窗口卖了76号票
4号窗口卖了77号票
4号窗口卖了71号票
4号窗口卖了70号票
4号窗口卖了69号票
4号窗口卖了68号票
4号窗口卖了67号票
4号窗口卖了66号票
4号窗口卖了65号票
4号窗口卖了64号票
4号窗口卖了63号票
3号窗口卖了72号票
2号窗口卖了73号票
1号窗口卖了74号票
2号窗口卖了60号票
3号窗口卖了61号票
4号窗口卖了62号票
3号窗口卖了57号票
2号窗口卖了58号票
1号窗口卖了59号票
2号窗口卖了54号票
3号窗口卖了55号票
4号窗口卖了56号票
3号窗口卖了51号票
2号窗口卖了52号票
1号窗口卖了53号票
2号窗口卖了48号票
3号窗口卖了49号票
4号窗口卖了50号票
3号窗口卖了45号票
2号窗口卖了46号票
1号窗口卖了47号票
2号窗口卖了42号票
3号窗口卖了43号票
4号窗口卖了44号票
3号窗口卖了39号票
2号窗口卖了40号票
1号窗口卖了41号票
2号窗口卖了36号票
3号窗口卖了37号票
4号窗口卖了38号票
3号窗口卖了33号票
3号窗口卖了31号票
2号窗口卖了34号票
1号窗口卖了35号票
2号窗口卖了29号票
2号窗口卖了27号票
3号窗口卖了30号票
4号窗口卖了32号票
3号窗口卖了25号票
2号窗口卖了26号票
1号窗口卖了28号票
2号窗口卖了22号票
3号窗口卖了23号票
4号窗口卖了24号票
3号窗口卖了19号票
2号窗口卖了20号票
1号窗口卖了21号票
2号窗口卖了16号票
3号窗口卖了17号票
4号窗口卖了18号票
3号窗口卖了13号票
2号窗口卖了14号票
1号窗口卖了15号票
2号窗口卖了10号票
3号窗口卖了11号票
4号窗口卖了12号票
3号窗口卖了7号票
2号窗口卖了8号票
1号窗口卖了9号票
2号窗口卖了4号票
3号窗口卖了5号票
4号窗口卖了6号票
3号窗口卖了1号票
2号窗口卖了2号票
1号窗口卖了3号票
大家帮解释下运行结果为什么有四个100号票啊???



评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

8 个回复

倒序浏览
多线程访共享数据,有做安全处理么?
回复 使用道具 举报
从结果上看应该没什么大问题
应该是你在主函数里还有另一个输出语句
代码不全,分析不出来
回复 使用道具 举报
Forevery 发表于 2013-12-10 21:37
从结果上看应该没什么大问题
应该是你在主函数里还有另一个输出语句
代码不全,分析不出来 ...

没有啊!我把代码都复制上来了,麻烦你再看下吧
回复 使用道具 举报
代码呢,你没加锁吧,老毕的视频你看完了么,票数你没有加限制所以四个线程都是从100卖起
回复 使用道具 举报
一个人旅行 发表于 2013-12-10 21:48
代码呢,你没加锁吧,老毕的视频你看完了么,票数你没有加限制所以四个线程都是从100卖起 ...

我就是按照老毕视频敲出来的啊!!
回复 使用道具 举报
  1. class Ticket extends Thread
  2. {        
  3.         private static int tick=100;
  4.         Object obj = new Object();
  5.         Ticket(String name)
  6.         {
  7.                 super(name);
  8.         }
  9.         public void run()
  10.         {
  11.                 while(true)
  12.                 {
  13.                                         synchronized(obj)
  14.                                         {
  15.                                         if (tick>0)
  16.                         {
  17.                                 System.out.println(Thread.currentThread().getName()+"卖了"+tick--+"号票");
  18.                         }
  19.                                         }   
  20.                 }
  21.         }
  22. }
  23. class TicketDemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Ticket t1=new Ticket("1号窗口");
  28.                 Ticket t2=new Ticket("2号窗口");
  29.                 Ticket t3=new Ticket("3号窗口");
  30.                 Ticket t4=new Ticket("4号窗口");
  31.                 t1.start();
  32.                 t2.start();
  33.                 t3.start();
  34.                 t4.start();
  35.         }
  36. }
复制代码

给你加个同步,在我电脑里解决了问题。
但是还有一个问题可能会出现,嘎嘎,不知道你会不会发现

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
Forevery 发表于 2013-12-10 22:00
给你加个同步,在我电脑里解决了问题。
但是还有一个问题可能会出现,嘎嘎,不知道你会不会发现 ...

抛异常就OK了

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 wangchao1686 于 2013-12-11 00:00 编辑

死循环,程序根本停不下来。7楼说的是这个意思吧。
代码改进如下

  1. <p>class Ticket extends Thread
  2. {        
  3.         private static int tick=100;
  4.         Object obj = new Object();
  5.         Ticket(String name)
  6.         {
  7.                 super(name);
  8.         }
  9.         public void run()
  10.         {
  11.             synchronized(obj)
  12.             {
  13.                     while(true)
  14.                 {
  15.                                 if (tick>0)
  16.                                       {
  17.                                           System.out.println(Thread.currentThread().getName()+"卖了"+tick--+"号票");
  18.                                      }
  19.                                 else break;   
  20.                    }   
  21.                 }
  22.         }
  23. }
  24. class TicketDemo
  25. {
  26.         public static void main(String[] args)
  27.         {
  28.                 Ticket t1=new Ticket("1号窗口");
  29.                 Ticket t2=new Ticket("2号窗口");
  30.                 Ticket t3=new Ticket("3号窗口");
  31.                 Ticket t4=new Ticket("4号窗口");
  32.                 t1.start();
  33.                 t2.start();
  34.                 t3.start();
  35.                 t4.start();
  36.         }

  37. }</p>
复制代码
复制代码

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马