В этом примере кода используется 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 должно быть разрешено выйти.Однако executorSerivce никогда не собирается и, следовательно, JVM остается в живых.Кажется, что даже вызовы System.gc () не работают.Почему executorService не собирается даже после завершения main ()?
Примечание: я знаю, что должен сам вызывать shutdown (), и я всегда делаю это вне тестирования.Мне любопытно, почему завершение не работает как резервная копия.