如果仅使用声明初始化,则ExecutorService会抛出RejectedExecutionException

时间:2013-09-10 20:52:24

标签: multithreading exception scheduledexecutorservice

我得到了一些代码,如果我只使用初始化声明,如

private static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

这会给我一个java.util.concurrent.RejectedExecutionException

executor.scheduleWithFixedDelay(runnable, 0, 2000, TimeUnit.MILLISECONDS);

但是如果我在使用

之前再次初始化
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleWithFixedDelay(runnable, 0, 2000, TimeUnit.MILLISECONDS);

一切正常。这是为什么?我发现的所有示例都不会在每次调度之前执行SingleThreadExecutor。我认为这只是设置池大小。它应该在声明期间进行初始化吗?!我很困惑:)谢谢

3 个答案:

答案 0 :(得分:1)

如果在您尝试提交要运行的新作业时关闭了executor,则会抛出RejectedExecutionException。您的executor变量声明为static,这意味着该类的所有实例将共享同一个变量。您的类的一个实例是否可能正在关闭执行程序,然后该类的另一个实例正在尝试安排新作业?

答案 1 :(得分:1)

两件事。

  1. 避免声明任何非最终的静态。
  2. 在某些时候可能shutdown

答案 2 :(得分:0)

没关系,这是一次关机-.-我预计当没有任务尚未运行时,终止是真的 - 感谢浪费你的时间给我:p