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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马陈旭东 中级黑马   /  2012-5-24 22:01  /  1337 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
  }
}
}

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 新人报到,赞一个!

查看全部评分

1 个回复

正序浏览
本帖最后由 谢述华 于 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, 下载次数: 14)

t1和t2处于等待状态.png

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

InterruptedException异常的来源.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马