【问题标题】:A new thread object that has not been started will be garbage collected?一个尚未启动的新线程对象会被垃圾回收吗?
【发布时间】:2015-11-13 11:09:47
【问题描述】:

我有来自 Java 虚拟机的源代码。这个虚拟机只有满足这些条件(两个条件)的垃圾收集线程:

  • 线程已完成(开始完成
  • 线程对象没有任何引用

我认为它应该用 no refence 垃圾收集 未启动的线程。但是这些线程被保存在 VM 内存中。对吗?


示例代码:

public class Test implements Runnable{

    private Thread thread;
    public Test() {
        thread = new Thread(this);
    }    

    @Override
    public void run() {
        //This thread never runs...
        //My question is about garbage collector in a situation like this...
    }    
}

考虑:

  • 测试对象不再有引用
  • Test 对象线程从未启动

测试线程会被垃圾回收吗?

【问题讨论】:

  • 我正在创建一个虚拟机,所以我需要了解这个概念。出于这个原因,我在这里寻求帮助:)
  • Thread 实例不是真正的线程,它是控制线程的api。一旦有一个正在运行的线程,您的 Thread 对象将被“从线程”引用,并且在这种情况下不能被 GC。

标签: java multithreading garbage-collection


【解决方案1】:

ThreadRunnable 类的实例类似于任何其他类的实例。所以,是的,如果引用超出范围,它将被 GCed。

注意:您首先必须创建一个Test 的实例。

running 线程作为 GC 的根,不会被 GC。它启动线程(通过调用start(),它实际上创建了一个执行线程并使它变得特别。

【讨论】:

  • @GabrielDias - 未启动的线程与任何其他对象一样,将以这种方式进行 GC。 正在执行的线程不会被 GC,因为正在运行的线程将充当 GC 根
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多