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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 禾呈 中级黑马   /  2013-6-6 01:26  /  1546 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 禾呈 于 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又如何判定锁内有程序在执行?

评分

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

查看全部评分

2 个回复

倒序浏览
具体回答,请看注释
  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. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
我知道了,Thread-0  sleep了但是并没有将锁释放 和wait不一样啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马