【问题标题】:Safe to start thread without keeping reference?在不保留参考的情况下安全地启动线程?
【发布时间】:2014-04-04 22:55:21
【问题描述】:

我的话题是这样开始的:

(new MyThread()).start();

我没有在任何地方保留对它的引用,所以我想知道这是否是一种安全的方法 - 因为它没有被引用,所以 GC 不能收集它吗?


如果不是(我认为是),那为什么?

【问题讨论】:

  • GC 可以收集它们,只要确保run 方法中的代码正确完成即可。另外,请使用ExecutorService,而不是天真地使用普通的Threads。
  • 今天我脑子里有同样的问题!!! :)
  • @LuiggiMendoza 这不是我的意思,无论如何,你能解释一下为什么 ExecutorService 比这更好吗?优势?
  • 线程(实际线程)是it's own GC root

标签: java multithreading


【解决方案1】:

如果您查看OpenJDK Java 7 source code of Thread,您会注意到start() 包含以下内容

group.add(this);

其中group 是由JVM 管理的ThreadThreadGroup。因此,当它仍在运行时,始终存在对 Thread 的可访问引用。不会被垃圾回收


如果仅此一项还不能令人信服,请考虑启动一个新线程意味着创建一个新调用堆栈,其中根调用是Thread 的方法之一,可能是一些native 方法。如果对象被垃圾回收,则不能执行对象的方法。因此,Thread 对象必须仍然存在。

【讨论】:

  • 啊,很酷。我认为可达性在较低级别得到保证。
  • @user2864740 肯定不止于此,但我认为仅此就足以确认它不会被 GC'ed。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多