包含线程或 ExecutorServices 的对象的垃圾收集

Garbage Collection of Objects which contains threads or ExecutorServices

如果我有一个 class Foo,如果我调用方法 doSomething() 并且我的主线程中有一个 Foo 的实例列表。

class Foo()
{
    private Thread t;

    public void doSomething()
    {
        t = new Thread(() ->  {
            while(!isInterrupted())
            {
                //do something
            }

        });
        t.start();
    }
}
  1. 如果我理解正确,如果我从列表中删除 Foo 的一个实例,如果我之前调用方法 doSomething 并且该实例创建了一个线程,它不会被垃圾回收?

因此我必须在 Foo 中添加一个方法,例如:

public void stop()
{
    if(t != null)
    {
        t.interrupt();
    }
}
  1. 如果我在从列表中删除实例后调用此方法,实例和线程(不再 运行)将对 GC 可用?

如果我在 Foo 中有一个 ExecutorService 而不是线程,例如:

scheduler = Executors.newSingleThreadScheduledExecutor();
sf = scheduler.scheduleAtFixedRate(() -> {/*do something*/}, 0, 1, TimeUnit.SECONDS);
  1. 这是相同的行为吗?我还必须调用 stop 方法吗?

stop 方法在这种情况下看起来像这样:

public void stop()
{
    if(sf != null)
    {
        sf.cancel(true);
    }
}

在所有情况下答案都是肯定的(请参阅 Peter Lawrey 在问题之外的评论)。