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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何超 中级黑马   /  2013-12-30 18:53  /  943 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何超 于 2013-12-31 11:51 编辑
  1. public class Thread extends java.lang.Thread {
  2.         static int ticket=100;
  3.         boolean flag=true;
  4.         public void run(){        
  5.                 while(flag){
  6.                 ticket--;
  7.                 System.out.println(Thread.currentThread()+"余票为"+ticket);
  8.                 if(ticket==0)
  9.                         flag=false;
  10.                         }
  11.         }
  12.         public static void main(String[] args) throws InterruptedException {
  13.                 // TODO Auto-generated method stub
  14.                 Thread t1=new Thread();
  15.                 Thread t2=new Thread();
  16.                 t1.start();               
  17.                 t2.start();
  18.                 t1.join();
  19.                 System.out.println("OVER");
  20.         }
  21. }
复制代码


最简单的一个线程,可是我看到运行结果有一个疑问,运行结果中有这样一项

Thread[Thread-1,5,main]余票为54
Thread[Thread-0,5,main]余票为85
Thread[Thread-0,5,main]余票为52


Thread[Thread-0,5,main]余票为1
Thread[Thread-0,5,main]余票为0
OVER
Thread[Thread-1,5,main]余票为53


1:ticket是静态变量为什么中间会出现85?而不是53,静态变量是全局共享,为什么突然从54变成85又变成52
2:  53为什么是在最后才出现?最后有一个输出语句我可以理解,但是不能理解的是为什么偏偏是上面对应的53在这里出现。
突然感觉上个月自学的全吐出来了{:soso_e127:}

评分

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

查看全部评分

3 个回复

正序浏览
少年,你的join()方法呢?
回复 使用道具 举报
本帖最后由 75100313 于 2013-12-30 20:24 编辑

{:soso_e113:}我也不是很懂 但是我想把我的想法跟楼主分享一下  共同研究

首先 线程本来随机性就很强  
针对于第一个问题 我不知道怎么回答你  静态变量 只是全局都使用这一个变量  你多运行几次
还会发现 出售相同的票  这都是源于线程的随机性   不能确定哪个线程先抢到资源  就一定先打印剩余票量
第一种 就是抢到票的没输出 结果最后输出
第二种 就是票已经卖到85张  他抢到了 就先输出了!


针对这种随机性   线程 用了 锁 Lock 和 synchronized 来控制  
具体怎么用我就不说了 老师的视频说得比我好  呵呵

回复 使用道具 举报
忘了说   ticket 和 flag  我的设置是

        static int ticket=100;
        boolean flag=true;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马