2012-06-09 18 views
4

所以我有一个“棘手”的问题,我想看看人们的意见。关于java线程生存期

我在编写一个组件,它扩展了一个JPanel并做了一些自定义的东西。 该组件我有一个线程内,至极永远循环是这样的:

//chat thread 
    Thread chat_thread = new Thread(new Runnable(){ 
     public void run(){ 
      while(true){ 
       //get chat updates 
      } 
     } 
    }); 
    chat_thread.start(); 

所以现在的问题是,磨片组件从其父通过remove()方法去除, 做这个线程仍然活着,或者它当你移除组件时死亡?

编辑:首先创建一个

Set<Thread> t = Thread.getAllStackTraces().keySet(); 
    Iterator it = t.iterator(); 
    while(it.hasNext()){ 
     Thread t2 = (Thread)it.next(); 
     if(t2.getName().equals("chat_thread")){ 
      t2.interrupt(); 
     } 
    } 

: 感谢所有您的答复,确实线程不会终止删除其启动,所以为了从另一个组件终止这个线程,我做了以下使用Thread.setName()方法为我的线程命名。 谢谢!

回答

4

它仍然活着。正在运行的线程构成GC的根。从一个从根开始的引用链可访问的所有内容都不符合GC的条件。这意味着,顺便说一句,你的面板也不会被GCed,因为线程持有对面板的隐式引用(EnclosingPanel.this)。

当您不想再运行时,您需要确保停止线程。

3

此线程永远不会死亡(除非它崩溃或终止本身)。

无论启动它的线程或包含它的组件发生了什么。

如果你不想挂上JVM,你可以声明它是一个守护进程线程。然后当其他事情发生时它会关闭。为了获得更多的控制权,您需要确保在适当的时候在自己的代码中终止线程。

1

线程不会死亡,直到它完成它的工作或你interrupt它。

+4

线程在中断时不会死亡。如果你中断了它,它会中断,如果它在中断时决定停止运行。 –

1

线程在退出run()方法时会终止,所以当remove()方法从其父类中移除该线程时,线程将永远不会终止。

0

看看Component.removeNotify。在您的组件,保持一个指向线程:

public class MyPanel extends JPanel { 
    private Thread thread = ...; 

    public void removeNotify() { 
     super.removeNotify(); 
     thread.interrupt(); 
    } 
} 

此方法由AWT本身叫时,它决定删除该组件(即Windows或Linux组件支持的AWT组件)的本地同行。按照javadoc:

通过销毁本地屏幕资源使此组件不可显示。 该方法由工具包在内部调用,不应由程序直接调用。重写此方法的代码应该调用super.removeNotify作为重写方法的第一行。