包含线程或 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();
}
}
- 如果我理解正确,如果我从列表中删除 Foo 的一个实例,如果我之前调用方法
doSomething
并且该实例创建了一个线程,它不会被垃圾回收?
因此我必须在 Foo 中添加一个方法,例如:
public void stop()
{
if(t != null)
{
t.interrupt();
}
}
- 如果我在从列表中删除实例后调用此方法,实例和线程(不再 运行)将对 GC 可用?
如果我在 Foo 中有一个 ExecutorService
而不是线程,例如:
scheduler = Executors.newSingleThreadScheduledExecutor();
sf = scheduler.scheduleAtFixedRate(() -> {/*do something*/}, 0, 1, TimeUnit.SECONDS);
- 这是相同的行为吗?我还必须调用
stop
方法吗?
stop
方法在这种情况下看起来像这样:
public void stop()
{
if(sf != null)
{
sf.cancel(true);
}
}
在所有情况下答案都是肯定的(请参阅 Peter Lawrey 在问题之外的评论)。
如果我有一个 class Foo,如果我调用方法 doSomething()
并且我的主线程中有一个 Foo 的实例列表。
class Foo()
{
private Thread t;
public void doSomething()
{
t = new Thread(() -> {
while(!isInterrupted())
{
//do something
}
});
t.start();
}
}
- 如果我理解正确,如果我从列表中删除 Foo 的一个实例,如果我之前调用方法
doSomething
并且该实例创建了一个线程,它不会被垃圾回收?
因此我必须在 Foo 中添加一个方法,例如:
public void stop()
{
if(t != null)
{
t.interrupt();
}
}
- 如果我在从列表中删除实例后调用此方法,实例和线程(不再 运行)将对 GC 可用?
如果我在 Foo 中有一个 ExecutorService
而不是线程,例如:
scheduler = Executors.newSingleThreadScheduledExecutor();
sf = scheduler.scheduleAtFixedRate(() -> {/*do something*/}, 0, 1, TimeUnit.SECONDS);
- 这是相同的行为吗?我还必须调用
stop
方法吗?
stop
方法在这种情况下看起来像这样:
public void stop()
{
if(sf != null)
{
sf.cancel(true);
}
}
在所有情况下答案都是肯定的(请参阅 Peter Lawrey 在问题之外的评论)。