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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jaijaiok 中级黑马   /  2013-12-5 23:50  /  1439 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想通过 t.interrupt();终止线程的运行,可结果却是死循环,未能终止线程,这是为什么呢?哪位大侠帮忙解答!!!

  1. class Demo implements Runnable
  2. {
  3. //boolean flag = true ;
  4. public void run()
  5. {
  6.   int i = 0 ;
  7.   while(flag)
  8.   {
  9.    System.out.println("运行 i = "+i++) ;
  10.   }
  11. }
  12. };
  13. public class ThreadDemo20
  14. {
  15. public static void main(String args[])
  16. {
  17.   // 希望while循环运行100毫秒之后程序要停止
  18.   Demo d = new Demo() ;
  19.   Thread t = new Thread(d) ;
  20.   t.start() ;
  21.   try
  22.   {
  23.    Thread.sleep(10) ;
  24.   }
  25.   catch (Exception e)
  26.   {
  27.   }
  28.   // 修改标志位,使线程停止
  29.   //d.flag = false ;
  30.   t.interrupt();
  31. }
  32. };
复制代码







评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

5 个回复

倒序浏览
主线程休眠之后,还未获得时间片,已经栈溢出了.
你Thread.sleep(10),让线程睡10毫秒,,,因为你是在主线程执行的 所以你让主线程睡10毫秒, 可是你demo线程没睡啊,然后你又t.interrupt()  ,,t线程根本就没睡,你还intterupt... 还有就是 你把那个注释的前面2杠去掉 是不是就可以了?,你想用第二种方法 看行不行?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报

将这第3行和第32行注释去掉,然后将第12行和第32行的";"去掉就行了,问题就解决了
回复 使用道具 举报
就稍微改了点就是你的要求啊把关键两个注释去掉就行了
class Demo implements Runnable
{
boolean flag = true ;
public void run()
{
  int i = 0 ;
  while(flag)
  {
   System.out.println("运行 i = "+i++) ;
  }
}
}
public class ThreadDemo20
{
public static void main(String args[])
{
  // 希望while循环运行100毫秒之后程序要停止
  Demo d = new Demo() ;
  Thread t = new Thread(d) ;
  t.start() ;
  try
  {
   Thread.sleep(10) ;
  }
  catch (Exception e)
  {
  }
  // 修改标志位,使线程停止
  d.flag = false ;
  t.interrupt();
}
}

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
如果我给你说上面的人都是背概念的你信不信
interrupt()方法的作用只是用来改变线程的中断状态(把线程的中断状态改为true,即被中断)并不能是线程终止
楼上的回答可以解决你的问题通过boolean控制,我估计你是想用Thread的interrup方法进行终止,如果用这方法确实可以终止,但不知Jni内部是如何实现的,你最好还是让线程自然的消亡的好
  1. public void interrupt() {
  2.         if (this != Thread.currentThread())
  3.             checkAccess();

  4.         synchronized (blockerLock) {
  5.             Interruptible b = blocker;
  6.             if (b != null) {
  7.                 interrupt0();           // Just to set the interrupt flag
  8.                 b.interrupt(this);
  9.                 return;
  10.             }
  11.         }
  12.         interrupt0();
  13.     }
复制代码

private native void interrupt0();//这是JNI
回复 使用道具 举报
王家胜 发表于 2013-12-6 14:20
如果我给你说上面的人都是背概念的你信不信
interrupt()方法的作用只是用来改变线程的中断状态(把线程的中 ...

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