【问题标题】:Java what does a thread do when it's done running?Java线程完成运行后会做什么?
【发布时间】:2012-08-12 04:12:52
【问题描述】:

在我制作的游戏中,我使用了多个线程实例,但它不会跟踪它们。

clientThread cT = new clientThread(socket);
new Thread(cT).start();

我需要知道的是,当一个tread实例完成时(所有循环都已完成并且不再被使用),就像一个方法的实例一样,它会被丢弃吗?还是我需要使用一段特殊的代码来丢弃它?

【问题讨论】:

  • 您可以尝试完全不丢弃它们。我相信 java 中有 while 循环。

标签: java multithreading sockets


【解决方案1】:

线程是一个普通对象,它将像任何其他对象一样被垃圾收集。在线程对象的情况下,当线程退出时,它就有资格被收集。

【讨论】:

    【解决方案2】:

    run() 完成后将被丢弃。你不需要添加任何特殊的代码来发布。

    注意:丢弃并不意味着它已从内存中消失(但不会继续运行)。下次 GC 收集运行时可能会被 GC。

    【讨论】:

    • 嗯,run() 完成后立即丢弃有点过分。它会停止运行,但是Java中的GC并不是贪婪的,它只会在它认为必要的时候运行。
    • 即便如此,如果其他人持有对它的引用,Thread(或Runnable,或Callable)也不会被GC'ed。从这个意义上说,它就像任何其他对象一样。
    • @yshavit:任何对象都不能被 GC,除非它们不可访问。您能否提供一个示例/案例,即使在线程完成后也可以保留线程?
    • @thinksteep 简单。 final static Thread myThreadRef = whatever(); static { myThreadRef.start(); } 即使在线程结束后,Thread 对象也会一直保留到定义 myThreadRef 的类被卸载。
    • @yshavit 如果有其他东西持有对它的 非弱 引用,它将不会被 GC ;)
    【解决方案3】:

    如果垃圾收集器到达它,它将被销毁。

    【讨论】:

      【解决方案4】:

      其他朋友完全按照您的要求回答。只有一条评论。

      我正在使用线程的许多实例,但它不会保留 跟踪他们。

      不要这样做:new Thread(cT).start(); 即开始生成线程。
      阅读线程池和ExecutorService

      【讨论】:

      • +1 但是,IME,您在浪费时间。某处有一个 Uni course 或 WebPage,上面写着“不断创建线程,等待 Join() 然后让线程终止”实际上是一个好主意。在为了整个世界的利益而暗杀课程/网站作者之前,您的努力都是白费。我很乐意自己扣动扳机。
      猜你喜欢
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多