我对线程有疑问。当我这样做时:
new Thread(new Runnable(){
@Override
public void run() {
//sth to do
}
}).start();
执行run()中的所有代码时会发生什么?系统是否自动删除线程或线程是否仍保留在内存中?
thx&问候
答案 0 :(得分:3)
当一个线程完成其run()方法时,它将进入'dead'状态。然后堆栈中的下一个线程运行。
死亡状态:
“当run()方法完成时,线程被认为是死的 仍然是一个可行的Thread对象,但它不再是一个单独的线程 执行。一旦线程死了,就永远不会被带回来 生活! (整个“我看到死线程”的事情。)如果你调用start() 一个死的Thread实例,你会得到一个运行时(不是编译器)异常。 它可能不会让一位火箭科学家告诉你,如果一个 线程已经死了,它不再被认为是活着的。“
答案 1 :(得分:1)
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 Performance”一书。它包含有关此主题的许多信息(以及许多其他信息)。
希望有所帮助!
答案 2 :(得分:0)
当线程中的代码完成执行时,线程停止
Thread
实例在获得GC之前仍然存在,但实际的系统线程将不再存在。
答案 3 :(得分:0)
如果您不使用任何自定义配置的线程池机制,您的线程将会死亡,Thread
对象本身将有资格进行垃圾回收。