黑马程序员技术交流社区

标题: 我有个多线程的问题,望大家帮忙解答下!!! [打印本页]

作者: woaiheima    时间: 2013-12-10 21:15
标题: 我有个多线程的问题,望大家帮忙解答下!!!
本帖最后由 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号票啊???




作者: 風諾    时间: 2013-12-10 21:35
多线程访共享数据,有做安全处理么?
作者: Forevery    时间: 2013-12-10 21:37
从结果上看应该没什么大问题
应该是你在主函数里还有另一个输出语句
代码不全,分析不出来
作者: woaiheima    时间: 2013-12-10 21:42
Forevery 发表于 2013-12-10 21:37
从结果上看应该没什么大问题
应该是你在主函数里还有另一个输出语句
代码不全,分析不出来 ...

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

我就是按照老毕视频敲出来的啊!!
作者: Forevery    时间: 2013-12-10 22:00
  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. }
复制代码

给你加个同步,在我电脑里解决了问题。
但是还有一个问题可能会出现,嘎嘎,不知道你会不会发现
作者: 一个人旅行    时间: 2013-12-10 22:06
Forevery 发表于 2013-12-10 22:00
给你加个同步,在我电脑里解决了问题。
但是还有一个问题可能会出现,嘎嘎,不知道你会不会发现 ...

抛异常就OK了
作者: wangchao1686    时间: 2013-12-10 23:56
本帖最后由 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>
复制代码
复制代码





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