有没有办法确认线程是否在执行结束时被杀死?如果垃圾收集器花费很长时间来销毁线程,即使它们可用于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()
{
....
}
}
}
}
答案 0 :(得分:1)
你是绝对正确的,“在run方法结束时,线程被杀死,我们不需要做任何明确的事情来杀死线程实例”。只需让线程保留其run()
方法就足够了。
如果要确保特定线程已终止,则Thread.isAlive()将检查,Thread.join()将等到它发生。如果你有一组你担心的特定线程,那么在某处保留对它们的引用,并使用这些方法检查它们。
答案 1 :(得分:0)
Thread.getAllStackTraces()
获取当前的线程/堆栈跟踪映射。但是我通常希望JVM在退出run()
时清除线程。显然,如果你正在使用某种线程池,那就不是这样了。
答案 2 :(得分:0)
您可以使用某些软件(如 visualvm )来监控线程状态。 这些软件将为您提供充分的灵活性,以便以可视方式分析您的应用程序。
要检查线程的状态,可以在线程对象上调用getState()方法来查看线程的状态。
答案 3 :(得分:0)
当Java虚拟机无法分配对象时抛出,因为 内存不足,没有更多的内存可供使用 垃圾收集器。
因此,如果一个线程不再运行并且有资格使用GC,那么GC会在抛出OOM之前尝试收集它。和任何其他对象一样。
答案 4 :(得分:0)
有没有办法确认线程是否在执行结束时被杀死?
没有任何意义确认你知道的事情是真的。每当JVM进程终止时,其所有线程都会被操作系统自动杀死。任何其他行为都是操作系统中的错误。
如果垃圾收集器需要很长时间来销毁线程,即使它们可用于GC,也可能会出现内存不足的情况。
垃圾收集器不会杀死线程--JVM将特定于操作系统的线程库包装到一致的Java语言线程抽象中,因此这些线程库确定线程何时死亡。
我的理解是,在run方法结束时,线程被杀死,我们不需要做任何明确的事情来杀死线程实例。
这是正确的。
答案 5 :(得分:0)
如果你在Thread class的javadoc中查找,你会看到很多方法可以帮助你检查你想要的东西,例如:
activeCount():返回当前线程的线程组中活动线程的数量。
您可以将其用作调试方法。
isAlive():测试此线程是否处于活动状态。
检查特定线程是否存活。
join():等待此线程死亡。
如果你在方法结束时调用它,那么它将等待线程加入(即结束执行),然后再推进。如果你调用所有线程,那么你确定当main()完成时所有线程都已完成。
destroy():销毁此线程,无需任何清理。
它说的是什么,但我永远不会建议。
希望它有所帮助!