【问题标题】:Do java threads get deleted when they finishjava线程完成后会被删除吗
【发布时间】:2020-05-04 20:43:32
【问题描述】:

假设我使用下面的方法每隔几秒钟生成一个线程,每个线程大约需要一秒钟才能完成。完成的线程会被删除吗?

new Thread (new myRunnableClass()).start();

【问题讨论】:

  • 如果过程像你的例子一样简单,并且每个线程都保证在下一个开始之前完成,你可以重复使用一个线程吗?我猜你的实际程序比这更复杂,但我只是把建议扔在那里。
  • @musicfreak:你知道,你刚刚提出了一个非常了不起的观点。出于某种原因,我一直在其他地方这样做,我想这种情况看起来有点不同,但我想出了一种将这种技术应用于我的问题的方法。谢谢!

标签: java multithreading concurrency


【解决方案1】:

一旦线程完成(大约在run() 完成时),本机操作系统级线程就会被释放,但是线程对象像任何其他对象一样仍然存在,直到它变得无法访问并且垃圾收集器感觉像是在运行。

编辑:知道Thread(在Sun 的 Oracle 的实现中,anywho)有一个在线程退出时由VM 调用的私有方法也可能很有趣,它积极地使几个字段为空,包括引用由Thread(Runnable) 构造函数设置的Runnable 的字段。所以即使你保留了对Thread的引用,它在执行完成后不需要的东西也会被释放。

【讨论】:

    【解决方案2】:

    我不会称之为删除。一旦线程完成,它将进入死状态,准备好被 JVM 收集垃圾。

    【讨论】:

    • ... 除非其他一些“实时”数据结构维护对线程对象的引用。使用 OP 中提出的示例不会有问题。
    • ... 但这是一种模式,而不是当您想要 join() 线程时出现的模式,例如,从 Runnable 检索一些结果,但同样,您不能这样做你的例子,因为 Runnable 参考丢失了。
    【解决方案3】:

    产生一个新线程是一个相当昂贵的过程。你想要的是一个线程池。有不同的方法可以解决这个问题 - here's one

    【讨论】:

    • 很久以前在 nix 系统(*即 Linux)中生成线程 很昂贵,但在内核 2.4 中(或者是2.6?)他们改变了他们的线程系统,因此现在产生新线程实际上是免费的。请注意,在 Windows 环境中,生成线程一直很便宜。也就是说,使用线程池是一件很聪明的事情,因为自然总会有一些开销,而且你很少真正需要十亿个运行线程,而大约需要十几个线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多