Как мы знаем, java.util.concurrent.Executors
содержит много методов, таких как
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
newSingleThreadExecutor
newSingleThreadScheduledExecutor
Они возвращают ExecutorService
, который содержит метод execute(Runnable task)
.Однако при вызове execute(Runnable task)
из ExecutorService
, возвращенного из вышеупомянутых фабричных методов , он может завершиться только путем вызова shutdown()
или shutdownNow()
Например, если мы добавим следующий код в метод main
,
ExecutorService e = Executors.newSingleThreadExecutor();
e.execute(() -> system.out.println("test"));
, то вызов основной программы никогда не прекратится, поскольку shutdown()
или shutdownNow()
не вызывается.Таким образом, программа, содержащая следующий фрагмент в main , прекратит работу
ExecutorService e = Executors.newSingleThreadExecutor();
e.execute(() -> system.out.println("test"));
e.shutdown();
Однако некоторые подклассы ExecutorService
, такие как возвращаемый при вызове Executors.newWorkStealingPool
или ForkJoinPool
, могутзавершить работу без вызова shutdown()
или shutdownNow()
Итак, мой ВОПРОС : почему execute()
из ExecutorService
возвращается из вышеупомянутых фабричных методов начинаться с "new" не завершается без вызова shutdown()
или shutdownNow()
с точки зрения дизайна?