黑马程序员技术交流社区

标题: 多线程中打印输出的疑惑 [打印本页]

作者: hoop.zeng    时间: 2015-5-7 09:26
标题: 多线程中打印输出的疑惑
刚看到多线程,老师举了一个卖票的例子:定义4个窗口(线程),将100张票卖出并打印。代码如下:
  1. class J11_1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 //新建4个窗口
  6.                 Ticket t1 = new Ticket();
  7.                 Ticket t2 = new Ticket();
  8.                 Ticket t3 = new Ticket();
  9.                 Ticket t4 = new Ticket();
  10.                
  11.                 //开始窗口线程
  12.                 t1.start();
  13.                 t2.start();
  14.                 t3.start();
  15.                 t4.start();
  16.         }
  17. }
  18. class Ticket extends Thread
  19. {
  20.         //票的总数为100
  21.         private static int num=100;
  22.         public void run()
  23.         {
  24.                 while(true)
  25.                 {
  26.                         //将100张票全部卖出,并打印
  27.                         if(num > 0)
  28.                         {
  29.                                 System.out.println(currentThread().getName()+"sale:"+num--);
  30.                         }
  31.                 }
  32.         }
  33. }
复制代码

结果如附件:

虽然是多线程,但语句的执行应该是100-1的顺序来执行吧。
结果却没有按照100-1的顺序打印,老师提到了这跟java调用了cmd有关,但还是不太理解。




作者: hufu4635    时间: 2015-5-7 10:00
不明白你啥意思,据我分析,当主程序一运行,根据你的代码就开启了四个线程,因为你是继承了Thread类,所以是每个线程都卖100张票,这一张票没有共享。顺序是随机的。
作者: hoop.zeng    时间: 2015-5-7 11:24
hufu4635 发表于 2015-5-7 10:00
不明白你啥意思,据我分析,当主程序一运行,根据你的代码就开启了四个线程,因为你是继承了Thread类,所以 ...

private static int num = 100;
因为是静态变量,是所有对象共享的啊。
虽然四个线程的执行是随机,但都遵循-1的操作。
如第一步不论执行的是哪个线程,num都为100;
第二步不论是哪个线程,num都为99.依次类推
作者: hufu4635    时间: 2015-5-7 12:18
hoop.zeng 发表于 2015-5-7 11:24
private static int num = 100;
因为是静态变量,是所有对象共享的啊。
虽然四个线程的执行是随机,但都 ...

那这样的话四个线程共享一个,但四个线程谁会先执行是不确定的,CPU在不停地在做切换动作,所以打印的顺序不是依次递减的,这样就对了吧
作者: Mr7952    时间: 2015-5-7 12:42
你最后那个理解应该是对的。另外问下,你看的是哪个视频啊
作者: hoop.zeng    时间: 2015-5-7 13:32
Mr7952 发表于 2015-5-7 12:42
你最后那个理解应该是对的。另外问下,你看的是哪个视频啊

毕向东最新经典Java基础视频\第11天
133多线程(售票的例子)
作者: Mr7952    时间: 2015-5-7 19:07
hoop.zeng 发表于 2015-5-7 13:32
毕向东最新经典Java基础视频\第11天
133多线程(售票的例子)

噢,谢谢




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