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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高鑫 中级黑马   /  2012-5-23 02:02  /  1318 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class StopThread implements Runnable
  2. {
  3.         private boolean flag = true;
  4.         public  synchronized void run()
  5.         {
  6.                 while(flag)       
  7.                 {
  8.                         try
  9.                         {
  10.                                 wait();
  11.                         }
  12.                         catch (InterruptedException e)
  13.                         {
  14.                                 System.out.println(Thread.currentThread().getName()+".....Exception");
  15.                                 //setFlag();

  16.                         }
  17.                         System.out.println(Thread.currentThread().getName()+".....");
  18.                 }
  19.         }
  20.         public void setFlag()
  21.         {
  22.                 flag = false;
  23.         }
  24. }

  25. class  StopThreadDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 StopThread st = new StopThread();

  30.                 Thread t1 = new Thread(st);
  31.                 Thread t2 = new Thread(st);
  32.                
  33.                 //t1.setDaemon(true);
  34.                 //t2.setDaemon(true);//将两个线程全标记成后台线程。

  35.                 t1.start();
  36.                 t2.start();

  37.                 int num = 1;
  38.                 while(true)
  39.                 {
  40.                         if(num++==50)
  41.                         {
  42.                                
  43.                                  t1.interrupt();         // (1)
  44.                                 t2.interrupt();  // (2)
  45.                                 st.setFlag();        //  (3)
  46.                                
  47.                                 break;
  48.                         }
  49.                        
  50.                         System.out.println(Thread.currentThread().getName()+"....."+num);
  51.                 }
  52.         }
  53. }
复制代码
这个是老师视频里的例题,我把(3)改动到1和2的下面,并把抛出异常中的setFlag();注释掉,按我的理解1,2,3是按顺序执行的,当程序执行到我注释的1,2的地方时,按我的理解是t1和t2线程结束冻结状态,抛出异常,打印
System.out.println(Thread.currentThread().getName()+".....")语句后,这时又循环到了wait语句,再次冻结。这时运行3, 改变标记,但是 t1和t2还是在冻结
冻结状态的啊,为什么程序能结束呢?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

1 个回复

正序浏览
你线程一运行就都wait了,然后主线程到50之后就读 while(true)
                {
                        if(num++==50)
                        {
                                
                                 t1.interrupt();         // (1)
                                t2.interrupt();  // (2)
                                st.setFlag();        //  (3)
                                
                                break;
                        }
这句了,那顺序下来读到break就跳出循环主线程就结束了,虚拟机也就关掉了,那当然2全部停掉了呗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马