黑马程序员技术交流社区

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

作者: 李贺晓    时间: 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