黑马程序员技术交流社区

标题: 毕老师同步锁部分有个疑问 [打印本页]

作者: Jim-剣◆﹏    时间: 2013-9-27 11:11
标题: 毕老师同步锁部分有个疑问
本帖最后由 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();
问题是毕老师在演示的时候竟然成功地实现了多线程,并没有出现我以上所说的情况,这是为什么呢
望黑马大神赐教


作者: 胡智    时间: 2013-9-27 11:48
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1线程在while循环里面不断循环,而不是CPU陷在while循环里面。CPU运行一段时间T1线程后,还可以调到其他线程运行。除非T1线程通过join()方法插队,才会让T1线程运行结束后再运行其他线程。你再看看毕老师对线程的解释。
作者: Jim-剣◆﹏    时间: 2013-9-27 12:02
胡智 发表于 2013-9-27 11:48
这个是CPU运行的机制问题,CPU是根据线程的优先级,随机地不断跳转地运行线程。
创建T1线程并运行后,是T1 ...

仔细想了下,懂了。还是因为没从以前单线程那种思维转换出来。就算while条件一直为真也不影响cpu的跳转,其实就和for(int i=0;i<10;i++)一个道理,不是非得执行完十次cpu才会跳转




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