22

executor 对象是否意味着在shutdown? 我的意思是,如果我调用shutdownshutdownNow在执行程序终止之后,我应该new创建一个新的线程池还是有可能以某种方式“重置”/重用先前终止的执行程序并重用它?

更新:
如果我需要创建新的线程池,我如何“理解”之前的已经停止?
例如以下:

public void startPool(){  
   if(threadPool != null && !threadPool.isShutdown()){
    return;
   }  
   threadPool = Executors.newCachedThreadPool();  
   //other stuff

}  

public void stopPool(){  
   if(threadPool != null){  
    threadPool.shutdown();   
  }  
}   

不管用。如果我调用stop然后start由于条件原因将不会创建新的线程池。对此进行编码的正确方法是什么?

4

3 回答 3

21

文档

终止时,执行者没有正在执行的任务,没有等待执行的任务,也没有新的任务可以提交

所以(简要地),不,你不能重复使用它。从shutdown() 文档

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。

方法isTerminated()isShutdown()可用于确定执行器是否已关闭,以及任务是否已分别完成。

于 2013-02-20T10:38:20.190 回答
6

1) ThreadPoolExecutor 关闭后不能重用,API

An ExecutorService can be shut down, which will cause it to reject new tasks

注意:如果要重用它,请不要关闭 ThreadPoolExecutor。

2)如果您想知道是否需要重新创建 ThreadPoolEdxecutor 使用

ExecutorService.isShutdown()

如果此执行程序已关闭,则返回 true

于 2013-02-20T10:46:33.730 回答
6

我们在这里谈论的是 Oracla Javas ThreadPoolExecutor(实现 Executor 接口)。在那里,关于 shutdown 的方法注释并没有明确禁止将Shutdown转换回Running,但类注释列出了 ThreadPoolExecutors 支持的所有转换,并且无法从Shutdown返回。返回将需要另一种方法重新启动/启动或类似的。这不存在,但发现它有用的人可以扩展接口并实现关机后重新启动,而不会破坏关机语义。这样做可能会有点困难,因为关闭本身并不能保证处理最终会停止。所以工人们可能会继续工作,直到他们完成,如果他们完成的话。与创建另一个执行程序相比,在这种情况下重新启动可能不值得额外的工作。

于 2013-02-20T10:51:05.993 回答