黑马程序员技术交流社区
标题:
线程的问题?
[打印本页]
作者:
禾呈
时间:
2013-6-6 01:26
标题:
线程的问题?
本帖最后由 禾呈 于 2013-6-6 19:43 编辑
import java.util.*;
class thread implements Runnable
{
public void run()
{
System.out.println(Thread.currentThread().getName()+"进来了");
synchronized(Demo.class)
{
try{Thread.currentThread().sleep(10);}
catch(Exception e){}
while(true)
System.out.println("我是"+Thread.currentThread().getName());
}
}
}
class Demo
{
public static void main(String args[])
{
thread thr=new thread();
new Thread(thr).start();//其为 Thread-0线程
new Thread(thr).start();//其为Thread-1线程
}
}
复制代码
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
具体回答,请看注释
class thread implements Runnable
{
public void run()
{
System.out.println(Thread.currentThread().getName()+"进来了");
/*回答楼主,虽然上面的语句会输出:
* Thread-0进来了
* Thread-1进来了
* 但是真正执行下面的语句的时候,有可能是 Thread-1(或者Thread-0)带着锁"Demo.class"在锁内运行,即使sleep也是在同步代码块内部sleep
* 另一个Thread-0(或者Thread-1)其实并没有进入锁内,因此另一个线程并没有进入同步代码块当中
* 所以得出的结论是:只有Thread-1(或者Thread-0)进入循环内部,而另一个并没有进行执行,而是在同步代码块外部进行等待.
*/
synchronized(Demo.class)
{
try{Thread.currentThread().sleep(1000);}
catch(Exception e){}
while(true)
System.out.println("我是"+Thread.currentThread().getName());
}
}
}
class Demo
{
public static void main(String args[])
{
thread thr=new thread();
new Thread(thr).start();//其为 Thread-0线程
new Thread(thr).start();//其为Thread-1线程
}
}
复制代码
作者:
禾呈
时间:
2013-6-6 19:34
我知道了,Thread-0 sleep了但是并没有将锁释放 和wait不一样啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2