有没有办法确认线程是否在执行结束时被杀死?

时间:2012-03-12 17:46:47

标签: java

有没有办法确认线程是否在执行结束时被杀死?如果垃圾收集器花费很长时间来销毁线程,即使它们可用于GC,也可能会出现内存不足的情况。要摆脱这些问题,最好知道线程是否已被破坏。

截至目前,我的理解是在run方法结束时,线程被杀死,我们不需要做任何明确的事情来杀死线程实例。

提前致谢!

class A
{
    public static void main()
    {
        Thread t = new Thread(new TestA());
         t.start();
        Thread t1 = new Thread(new TestB());
         t1.start();
        Thread t2 = new Thread(new TestC());
         t2.start();
    }
}
class TestA implements Runnable {
Thread t;

    public void run() {
           for(...){
           try{

           }catch()
           {
            ....
           }
           } 
        }

 }

6 个答案:

答案 0 :(得分:1)

你是绝对正确的,“在run方法结束时,线程被杀死,我们不需要做任何明确的事情来杀死线程实例”。只需让线程保留其run()方法就足够了。

如果要确保特定线程已终止,则Thread.isAlive()将检查,Thread.join()将等到它发生。如果你有一组你担心的特定线程,那么在某处保留对它们的引用,并使用这些方法检查它们。

答案 1 :(得分:0)

Thread.getAllStackTraces()

获取当前的线程/堆栈跟踪映射。但是我通常希望JVM在退出run()时清除线程。显然,如果你正在使用某种线程池,那就不是这样了。

答案 2 :(得分:0)

您可以使用某些软件(如 visualvm )来监控线程状态。 这些软件将为您提供充分的灵活性,以便以可视方式分析您的应用程序。

要检查线程的状态,可以在线程对象上调用getState()方法来查看线程的状态。

答案 3 :(得分:0)

javadoc of OutOfMemoryError说:

  

当Java虚拟机无法分配对象时抛出,因为   内存不足,没有更多的内存可供使用   垃圾收集器。

因此,如果一个线程不再运行并且有资格使用GC,那么GC会在抛出OOM之前尝试收集它。和任何其他对象一样。

答案 4 :(得分:0)

  

有没有办法确认线程是否在执行结束时被杀死?

没有任何意义确认你知道的事情是真的。每当JVM进程终止时,其所有线程都会被操作系统自动杀死。任何其他行为都是操作系统中的错误。

  

如果垃圾收集器需要很长时间来销毁线程,即使它们可用于GC,也可能会出现内存不足的情况。

垃圾收集器不会杀死线程--JVM将特定于操作系统的线程库包装到一致的Java语言线程抽象中,因此这些线程库确定线程何时死亡。

  

我的理解是,在run方法结束时,线程被杀死,我们不需要做任何明确的事情来杀死线程实例。

这是正确的。

答案 5 :(得分:0)

如果你在Thread class的javadoc中查找,你会看到很多方法可以帮助你检查你想要的东西,例如:

activeCount():返回当前线程的线程组中活动线程的数量。

您可以将其用作调试方法。

isAlive():测试此线程是否处于活动状态。

检查特定线程是否存活。

join():等待此线程死亡。

如果你在方法结束时调用它,那么它将等待线程加入(即结束执行),然后再推进。如果你调用所有线程,那么你确定当main()完成时所有线程都已完成。

destroy():销毁此线程,无需任何清理。

它说的是什么,但我永远不会建议。

希望它有所帮助!