Java“unstopped”执行/完成的线程

时间:2013-05-12 13:29:35

标签: java multithreading garbage-collection

我对线程有疑问。当我这样做时:

new Thread(new Runnable(){

        @Override
        public void run() {
            //sth to do
        }

    }).start();

执行run()中的所有代码时会发生什么?系统是否自动删除线程或线程是否仍保留在内存中?

thx&问候

4 个答案:

答案 0 :(得分:3)

当一个线程完成其run()方法时,它将进入'dead'状态。然后堆栈中的下一个线程运行。

死亡状态:

  

“当run()方法完成时,线程被认为是死的   仍然是一个可行的Thread对象,但它不再是一个单独的线程   执行。一旦线程死了,就永远不会被带回来   生活! (整个“我看到死线程”的事情。)如果你调用start()   一个死的Thread实例,你会得到一个运行时(不是编译器)异常。   它可能不会让一位火箭科学家告诉你,如果一个   线程已经死了,它不再被认为是活着的。“

答案 1 :(得分:1)

Java的线程模型比这更复杂。

基本上,java.lang.Thread只是一些数据的包装器,而不是一个进程本身。当您调用.start()方法时,会创建一个本机线程并将其链接到您的Java Thread。这项工作由JVM使用内部数据结构(JavaThreadOSThread)完成。

完成.run()方法后,JVM会执行许多操作以删除使用的本机线程。因此,您不会再在流程列表中看到此主题(例如,使用topps)。

但是,在堆中分配的对象和java.lang.Thread实例本身会保留在内存中,直到GC循环收集它们为止。

所以,总结一下:

  • 是的,JVM删除使用的本机线程

  • 不,JVM不会删除使用的java.lang.Thread实例

  • GC最终将收集此实例

有关更多信息,请阅读Charlie Hunt撰写的“Java Performance”一书。它包含有关此主题的许多信息(以及许多其他信息)。

希望有所帮助!

答案 2 :(得分:0)

当线程中的代码完成执行时,线程停止 Thread实例在获得GC之前仍然存在,但实际的系统线程将不再存在。

答案 3 :(得分:0)

如果您不使用任何自定义配置的线程池机制,您的线程将会死亡,Thread对象本身将有资格进行垃圾回收。