我正在使用ScheduledExecutorService,在我称之为shutdown方法之后,我无法在其上安排Runnable。在scheduleAtFixedRate(runnable, INITIAL_DELAY,
INTERVAL, TimeUnit.SECONDS)
之后调用shutdown()
会抛出java.util.concurrent.RejectedExecutionException。在ScheduledExecutorService上调用shutdown()
后,是否有另一种方法可以运行新任务?
答案 0 :(得分:39)
您可以重复使用调度程序,但不应将其关闭。而是取消在调用scheduleAtFixedRate方法时可以获得的正在运行的线程。例如:
//get reference to the future
Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)
//cancel instead of shutdown
future.cancel(true);
//schedule again (reuse)
future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)
//shutdown when you don't need to reuse the service anymore
service.shutdown()
答案 1 :(得分:6)
shutdown()
的javadocs说:
Initiates an orderly shutdown in which previously submitted tasks are executed,
but no new tasks will be accepted.
因此,您无法调用shutdow()
然后安排新任务。
答案 2 :(得分:2)
关闭后,您无法让执行者接受新任务。更相关的问题是为什么你需要首先关闭它?您创建的执行程序应在应用程序或子系统的整个生命周期内重复使用。