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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李贺晓 中级黑马   /  2012-10-25 21:32  /  940 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李贺晓 于 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()呢,造成线程死锁,这个是什么原因

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1 淡定

查看全部评分

3 个回复

倒序浏览
当第一次进入StopThread 的run方法的时候,就会停在wait方法处等待,num的60次循环结束之后,wait方法仍会在等待,所以在改变flag的同时
应该唤醒两个线程继续执行,否则两个线程可能会一直处于等待状态之中,
        public void changeFlag(){
                flag = false;
                synchronized (this) {  
                        this.notifyAll();
                }
        }

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
你这个根本就没有用notify()去唤醒,线程会一直处于睡眠状态,你可以这样去定义:
     public void synchronized changeFlag()
        {
                flag = false;
        }
回复 使用道具 举报

你这个根本就没有用notify()去唤醒,线程会一直处于睡眠状态,你可以这样去定义:
     public void synchronized changeFlag()
        {
                flag = false;
                this.notify();
        }

评分

参与人数 1技术分 +1 收起 理由
谭立文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马