繁体   English   中英

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

[英]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使用内部数据结构( JavaThreadOSThread )完成。

一旦.run()方法完成,JVM就会执行许多操作来删除使用的本机线程。 因此,您不会在进程列表中看到此线程(例如,使用topps )。

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

所以,总结一下:

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

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

  • GC最终将收集此实例

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

希望有所帮助!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM