黑马程序员技术交流社区

标题: 一个中断程序的小纠结 [打印本页]

作者: 黑马陈旭东    时间: 2012-5-24 22:01
标题: 一个中断程序的小纠结
class Demo implements Runnable
{
boolean flag = true;
public synchronized void run()//t1
{
  while(flag)
  {
   try
   {
    this.wait();
   }
   catch (InterruptedException ie)
   {
    System.out.println(Thread.currentThread().getName()+"Exception");
    setFlag(false);
   }//有没有人告诉我这两个线程是怎么停留在这里的?setFlag(false);在这里有什么意义没有?

  }
}
public void setFlag(boolean flag)
{
  this.flag = flag;
}
}
class StopThread
{
public static void main(String[] args)
{
  Demo d = new Demo();
  Thread t1 = new Thread(d);
  Thread t2 = new Thread(d);
  t1.start();
  t2.start();
  int x = 0;
  while(true)
  {
   if(x++==50)
   {
    t1.interrupt();
    t2.interrupt();
    break;
   }
   System.out.println(Thread.currentThread().getName()+"***"+x);
  }
}
}


作者: xieshuhua    时间: 2012-5-25 11:39
本帖最后由 谢述华 于 2012-5-25 11:43 编辑

一、先回答你的问题:
①this.wait();使线程处于等待状态,所以两个线程全部在等待了。
setFlag(false);在这里没有意义,因为它根本不可能被调用。
二、再分析下你的程序:
①前面的打印全部是main线程的内容。屏蔽t1和t2后,可见打印效果。
  1. /* t1.interrupt();
  2. t2.interrupt();*/
复制代码
t1.t2还处于等待状态,所以需要结束他们。
②所以有了前面的interrupt()
然而处于等待状态的线程不能执行interrupt命令,正如使用wait方法时要处理InterruptedException异常。
故 打印的第二部分为异常处理情况(位于打印50次①以后)。
③setFlag没有被执行,所以无效的。如果被执行可以结束while循环,从而自然结束本线程。
具体还可以参看java.lang.Thread帮助文档中interrupt方法和java.lang.Object帮助文档中wait方法。希望能够帮到你~~


t1和t2处于等待状态.png (11.14 KB, 下载次数: 20)

t1和t2处于等待状态.png

InterruptedException异常的来源.png (9.45 KB, 下载次数: 18)

InterruptedException异常的来源.png





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2