1

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

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。我认为这只是设置池大小。它应该在声明期间被初始化?我很困惑:)谢谢

4

3 回答 3

2

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

于 2013-09-10T21:01:48.617 回答
1

两件事情。

  1. 避免声明任何不是最终的静态的。
  2. 可能是shutdown在某个时候。
于 2013-09-10T21:02:02.617 回答
0

没关系,这是关机 -.- 我希望 isTerminated 在没有任务运行时为真 -.- 感谢您为我浪费时间:p

于 2013-09-10T21:29:53.387 回答