黑马程序员技术交流社区
标题:
线程死锁的问题
[打印本页]
作者:
李贺晓
时间:
2012-10-25 21:32
标题:
线程死锁的问题
本帖最后由 李贺晓 于 2012-10-25 21:52 编辑
class StopThread implements Runnable
{
private boolean flag =true;
public synchronized void run()
{
while(flag)
{
try
{
wait();
}
catch (Exception e)
{
System.out.println(Thread.currentThread().getName()+"....Exception");
}
System.out.println(Thread.currentThread().getName()+"....run");
}
}
public void changeFlag()
{
flag = false;
}
}
class StopThreadDemo
{
public static void main(String[] args)
{
StopThread st = new StopThread();
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
t1.start();
t2.start();
int num = 0;
while(true)
{
if(num++ == 60)
{
st.changeFlag();
break;
}
System.out.println(Thread.currentThread().getName()+"......."+num);
}
}
}
这个时候当num=60的时候,把flag置为false后,线程不就进不去StopThread中的while中了,while不是都要判断,只要条件不符合,就不执行while中的内容,这个时候线程怎么会执行wait()呢,造成线程死锁,这个是什么原因
作者:
李连闯
时间:
2012-10-25 22:46
当第一次进入StopThread 的run方法的时候,就会停在wait方法处等待,num的60次循环结束之后,wait方法仍会在等待,所以在改变flag的同时
应该唤醒两个线程继续执行,否则两个线程可能会一直处于等待状态之中,
public void changeFlag(){
flag = false;
synchronized (this) {
this.notifyAll();
}
}
作者:
唐进
时间:
2012-10-25 23:01
你这个根本就没有用notify()去唤醒,线程会一直处于睡眠状态,你可以这样去定义:
public void synchronized changeFlag()
{
flag = false;
}
作者:
唐进
时间:
2012-10-25 23:02
你这个根本就没有用notify()去唤醒,线程会一直处于睡眠状态,你可以这样去定义:
public void synchronized changeFlag()
{
flag = false;
this.notify();
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2