执行器是否意味着要重用?

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

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

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

}  

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

将不起作用。如果我调用,则由于条件,将不会创建新的线程池。编写此代码的正确方法是什么?stopstart


答案 1

文档

终止后,执行程序没有正在执行的任务,没有等待执行的任务,并且不能提交任何新任务

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

启动有序关机,其中将执行以前提交的任务,但不接受任何新任务。

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


答案 2

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


推荐