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

时间:2015-11-18 08:00:29

标签: java garbage-collection java-threads

如果我有一个类Foo,如果我调用方法doSomething(),则实例可以创建一个线程,并且我的主线程中有一个Foo实例列表。

class Foo()
{
    private Thread t;

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

        });
        t.start();
    }
}
  1. 如果我理解正确,如果我从列表中删除其中一个Foo实例,如果之前调用方法doSomething并且实例创建了一个线程,它将不会被垃圾收集?
  2. 因此,我必须在Foo中添加一个方法,如:

    public void stop()
    {
        if(t != null)
        {
            t.interrupt();
        }
    }
    
    1. 如果我从列表中删除实例后调用此方法,那么实例和线程(不再运行)将可用于GC吗?
    2. 如果我在Foo中代替线程ExecutorService而不是:

      scheduler = Executors.newSingleThreadScheduledExecutor();
      sf = scheduler.scheduleAtFixedRate(() -> {/*do something*/}, 0, 1, TimeUnit.SECONDS);
      
      1. 这是同样的行为吗?我是否还必须调用stop方法?
      2. stop方法在这种情况下会看起来像这样:

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

1 个答案:

答案 0 :(得分:0)

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