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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Fightingforever 中级黑马   /  2014-10-25 11:57  /  1169 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

实在不能理解为什么

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

4 个回复

倒序浏览
class StopThread implements Runnable
{
        private boolean flag=true;
        public synchronized void run()
        {
                while(flag)
                                try
                                {
                                        this.wait();
                                        }
                                catch(InterruptedException 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);
                        }
                }
        }

我自己认为主线程运行完后 调用了changeFlage 函数,使Flag标为false了 t1和t2是不会运行的,但是结果却是

D:\java0217\day12>javac  StopThreadDemo.java

D:\java0217\day12>java StopThreadDemo
main......1
main......2
main......3
main......4
main......5
main......6
main......7
main......8
main......9
main......10
main......11
main......12
main......13
main......14
main......15
main......16
main......17
main......18
main......19
main......20
main......21
main......22
main......23
main......24
main......25
main......26
main......27
main......28
main......29
main......30
main......31
main......32
main......33
main......34
main......35
main......36
main......37
main......38
main......39
main......40
main......41
main......42
main......43
main......44
main......45
main......46
main......47
main......48
main......49
main......50
main......51
main......52
main......53
main......54
main......55
main......56
main......57
main......58
main......59
main......60
Thread-0...run
Thread-1...run

D:\java0217\day12>^A
回复 使用道具 举报
哪里不能理解啊??
回复 使用道具 举报
zd12345 发表于 2014-10-25 13:34
哪里不能理解啊??

为什么线程1 、2都运行了呀
回复 使用道具 举报
本帖最后由 noiary 于 2014-10-25 15:56 编辑

我在想,是不是两个线程已经运行了,只是在等待状态,即使flag设置成了false, 两个线程也要循环一次才能结束.
看起来是这样的,因为线程等待的时候已经判断完了循环条件,进入了while循环.

可以把try{this.wait()} catch{} 放到while循环外面试一下.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马