Если у меня есть класс 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?
Если у меня вместо потока ExecutorService
в Foo, например:
scheduler = Executors.newSingleThreadScheduledExecutor();
sf = scheduler.scheduleAtFixedRate(() -> {/*do something*/}, 0, 1, TimeUnit.SECONDS);
- Это такое же поведение? Должен ли я также вызывать метод
stop
?
Метод stop
в этом случае будет выглядеть примерно так:
public void stop()
{
if(sf != null)
{
sf.cancel(true);
}
}