[英]Java “unstopped ” executed/finished threads
我有一个关于线程的问题。 当我这样做时:
new Thread(new Runnable(){
@Override
public void run() {
//sth to do
}
}).start();
执行run()中的所有代码时会发生什么? 系统是否自动删除线程或线程是否仍保留在内存中?
感谢和问候
当一个线程完成其run()方法时,它将进入'dead'状态。 然后堆栈中的下一个线程运行。
死态:
“当一个线程的run()方法完成时,它被认为是死的。它可能仍然是一个可行的Thread对象,但它不再是一个单独的执行线程。一旦线程死了,它就永远不会恢复生命!(整个“我看到死线程”的事情。)如果你在一个死的Thread实例上调用start(),你将得到一个运行时(而不是编译器)异常。并且它可能不需要火箭科学家告诉你,如果一个线程已经死了,它不再被认为是活着的。“
Java的线程模型比这复杂一点。
基本上,java.lang.Thread只是一些数据的包装,而不是一个进程本身。 当您调用.start()
方法时,会创建一个本机线程并将其链接到您的Java Thread。 这项工作由JVM使用内部数据结构( JavaThread
和OSThread
)完成。
一旦.run()
方法完成,JVM就会执行许多操作来删除使用的本机线程。 因此,您不会在进程列表中看到此线程(例如,使用top
或ps
)。
但是,在堆中分配的对象和java.lang.Thread实例本身会保留在内存中,直到GC循环收集它们。
所以,总结一下:
是的,JVM删除了使用的本机线程
不,JVM不会删除使用的java.lang.Thread实例
GC最终将收集此实例
有关更多信息,请阅读Charlie Hunt撰写的“Java性能”一书。 它包含有关此主题的许多信息(以及许多其他信息)。
希望有所帮助!
当线程中的代码完成执行时,线程停止。
Thread
实例在获得GC之前仍然存在,但实际的系统线程将不再存在。
如果您不使用任何自定义配置的线程池机制,您的线程将死亡,并且Thread
对象本身将有资格进行垃圾回收。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.