В этом примере кода ExecutorService используется один и позволяет выйти из области видимости.
public static void main(String[] args)
{
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.submit(new Runnable()
{
public void run()
{
System.out.println("hello");
}
});
}
Как только функция executorService выходит из сферы действия, она должна быть собрана и завершена. Метод finalize() в ThreadPoolExecutor вызывает shutdown().
/**
* Invokes {@code shutdown} when this executor is no longer
* referenced and it has no threads.
*/
protected void finalize() {
shutdown();
}
Как только вызывается shutdown(), потоки пулов должны заканчиваться, а JVM должно быть разрешено выйти. Однако исполнитель никогда не собирается собираться, и, таким образом, JVM остается в живых. Даже вызовы System.gc() не работают. Почему не выполняется сбор исполнительной службы даже после завершения main()?
Примечание. Я знаю, что должен сам вызвать shutdown(), и я всегда делаю вне тестирования. Мне любопытно, почему финализация не работает в качестве резервной копии здесь.