2013-05-12 54 views
3

我有一个关于线程的问题。当我这样做:Java“未激活”已执行/完成的线程

new Thread(new Runnable(){ 

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

    }).start(); 

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

THX &问候

回答

0

当一个线程的代码执行完毕,线程停止。
Thread实例在获取GC'd之前仍然存在,但实际的系统线程将不再存在。

0

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

3

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

死亡状态:

“A线被认为是当它的run()方法完成死者可能 仍然是一个可行的Thread对象,但它已不再是一个单独的线程执行的 一次。一个线程死了,它永远不会被带回到 的生活!(整个“我看到死亡线程”的东西。)如果你在 上调用一个死的Thread实例的start(),你会得到一个运行时(不是编译器)例外 而且它可能不需要火箭科学家告诉你,如果线程死了,它不再被认为是活着的。“

1

Java的线程模型比这个稍微复杂一些。

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

一旦.run()方法完成,JVM将执行许多操作以删除所使用的本地线程。因此,在处理列表中不会再看到此线程(例如,使用topps)。

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

所以,总结一下:

  • 是的,JVM会删除使用

  • 没有,JVM不会删除java.lang中的本地线程。线程实例使用

  • GC将最终收集这种情况下

欲了解更多信息,你应该读的书“Java性能”查理亨特。它包含了很多关于这个主题的信息(和许多其他信息)。

希望有帮助!