黑马程序员技术交流社区

标题: 线程的问题? [打印本页]

作者: 禾呈    时间: 2013-6-6 01:26
标题: 线程的问题?
本帖最后由 禾呈 于 2013-6-6 19:43 编辑
  1. import java.util.*;
  2. class thread implements Runnable
  3. {
  4.         public void run()
  5.        {
  6.              System.out.println(Thread.currentThread().getName()+"进来了");
  7.              synchronized(Demo.class)
  8.             {
  9.                    try{Thread.currentThread().sleep(10);}
  10.                    catch(Exception e){}
  11.                    while(true)
  12.                    System.out.println("我是"+Thread.currentThread().getName());
  13.             }
  14.       }
  15. }
  16. class Demo
  17. {
  18.       public static void main(String args[])
  19.      {
  20.           thread thr=new thread();
  21.           new Thread(thr).start();//其为 Thread-0线程
  22.           new Thread(thr).start();//其为Thread-1线程
  23.       }
  24. }
复制代码
Thread-0线程开始执行在屏幕上输出  Thread-0进来了
线程Thread-0 sleep
Thread-1线程开始执行在屏幕上输出Thread-1进来了
线程Thread-1 sleep
线程Thread-0醒来 开始在while里转圈
线程Thread-1醒来 等待
/*执行顺序有可能有偏差*/
问:Thread-1醒来时已经在锁内 为何不能执行?  Thread-1又如何判定锁内有程序在执行?


作者: 朱志江    时间: 2013-6-6 02:28
具体回答,请看注释
  1. class thread implements Runnable
  2. {
  3.         public void run()
  4.        {
  5.              System.out.println(Thread.currentThread().getName()+"进来了");
  6.              /*回答楼主,虽然上面的语句会输出:
  7.               * Thread-0进来了
  8.               * Thread-1进来了
  9.               * 但是真正执行下面的语句的时候,有可能是 Thread-1(或者Thread-0)带着锁"Demo.class"在锁内运行,即使sleep也是在同步代码块内部sleep
  10.               * 另一个Thread-0(或者Thread-1)其实并没有进入锁内,因此另一个线程并没有进入同步代码块当中
  11.               * 所以得出的结论是:只有Thread-1(或者Thread-0)进入循环内部,而另一个并没有进行执行,而是在同步代码块外部进行等待.
  12.               */
  13.              synchronized(Demo.class)
  14.             {
  15.                    try{Thread.currentThread().sleep(1000);}
  16.                    catch(Exception e){}
  17.                    while(true)
  18.                    System.out.println("我是"+Thread.currentThread().getName());
  19.             }
  20.       }
  21. }

  22. class Demo
  23. {
  24.       public static void main(String args[])
  25.      {
  26.           thread thr=new thread();
  27.           new Thread(thr).start();//其为 Thread-0线程
  28.           new Thread(thr).start();//其为Thread-1线程
  29.       }
  30. }
复制代码

作者: 禾呈    时间: 2013-6-6 19:34
我知道了,Thread-0  sleep了但是并没有将锁释放 和wait不一样啊




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