黑马程序员技术交流社区

标题: 不能终止线程,死循环这是为什么? [打印本页]

作者: jaijaiok    时间: 2013-12-5 23:50
标题: 不能终止线程,死循环这是为什么?
我想通过 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. };
复制代码








作者: sd110572    时间: 2013-12-5 23:56
主线程休眠之后,还未获得时间片,已经栈溢出了.
你Thread.sleep(10),让线程睡10毫秒,,,因为你是在主线程执行的 所以你让主线程睡10毫秒, 可是你demo线程没睡啊,然后你又t.interrupt()  ,,t线程根本就没睡,你还intterupt... 还有就是 你把那个注释的前面2杠去掉 是不是就可以了?,你想用第二种方法 看行不行?
作者: ┾——黑马    时间: 2013-12-6 09:41

将这第3行和第32行注释去掉,然后将第12行和第32行的";"去掉就行了,问题就解决了
作者: 想你的夜    时间: 2013-12-6 12:25
就稍微改了点就是你的要求啊把关键两个注释去掉就行了
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();
}
}
作者: 王家胜    时间: 2013-12-6 14:20
如果我给你说上面的人都是背概念的你信不信
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
作者: jaijaiok    时间: 2013-12-6 21:01
王家胜 发表于 2013-12-6 14:20
如果我给你说上面的人都是背概念的你信不信
interrupt()方法的作用只是用来改变线程的中断状态(把线程的中 ...

:handshake




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