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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jim-剣◆﹏ 高级黑马   /  2013-9-27 11:11  /  1276 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Jim-剣◆﹏ 于 2013-9-27 13:44 编辑
  1. class Ticket implements Runnable
  2. {
  3.         private  int tick = 100;
  4.         public  void run()
  5.         {
  6.                         while(true)
  7.                         {
  8.                                 this.show();
  9.                         }
  10.         }
  11. }
  12.         public synchronized void show()
  13.         {
  14.                 if(tick>0)
  15.                 {
  16.                         try{Thread.sleep(10);}catch(Exception e){}
  17.                         System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
  18.                 }
  19.         }
  20. }


  21. class  ThisLockDemo
  22. {
  23.         public static void main(String[] args)
  24.         {
  25.                 Ticket t = new Ticket();

  26.                 Thread t1 = new Thread(t);
  27.                 Thread t2 = new Thread(t);
  28.                 Thread t3 = new Thread(t);
  29.                 t1.start();
  30.                 t2.start();
  31.                 t3.start();
  32.         }
  33. }
复制代码
毕老师的java基础看到了“第11天-12-多线程(多线程-同步函数的锁是this)”中间五分钟断一段代码执行十分不理解
主要是这段
  1. class Ticket implements Runnable
  2. {
  3.         private  int tick = 100;
  4.         public  void run()
  5.         {
  6.                         while(true)
  7.                         {
  8.                                 this.show();
  9.                         }
  10.         }
  11. }
复制代码
在run()方法里面,有个while循环,而且条件一直为true,那么就会一直调用show();
下面主函数创建了三个对象分别为t1,t2,t3,假设t1先抢到CPU进入到执行阶段,并且通过了while判断,那么应该是t1永远出不来了,因为while条件一直为真,只能不断执行show();
问题是毕老师在演示的时候竟然成功地实现了多线程,并没有出现我以上所说的情况,这是为什么呢
望黑马大神赐教

评分

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

查看全部评分

2 个回复

正序浏览
胡智 发表于 2013-9-27 11:48
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1 ...

仔细想了下,懂了。还是因为没从以前单线程那种思维转换出来。就算while条件一直为真也不影响cpu的跳转,其实就和for(int i=0;i<10;i++)一个道理,不是非得执行完十次cpu才会跳转
回复 使用道具 举报
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1线程在while循环里面不断循环,而不是CPU陷在while循环里面。CPU运行一段时间T1线程后,还可以调到其他线程运行。除非T1线程通过join()方法插队,才会让T1线程运行结束后再运行其他线程。你再看看毕老师对线程的解释。

评分

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

查看全部评分

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