执行者对象是否意味着在shutdown
之后重用?我的意思是如果我在执行程序终止后调用shutdown
或shutdownNow
,我应该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
,则由于条件而不会创建新的线程池。编码的正确方法是什么?
答案 0 :(得分:19)
来自the doc:
终止后,执行者没有任务正在执行,没有 等待执行的任务,并且不能提交任何新任务
所以(简要地),不,你不能重复使用它。来自the shutdown() doc:
启动有序关闭,其中执行先前提交的任务,但不接受任何新任务。
方法isTerminated()
和isShutdown()
可用于确定执行程序是否已关闭,以及任务是否已分别完成。
答案 1 :(得分:5)
1)关闭它后,你无法重用ThreadPoolExecutor,API
An ExecutorService can be shut down, which will cause it to reject new tasks
注意:如果要重用它,请不要关闭ThreadPoolExecutor。
2)如果您想知道是否需要重新创建ThreadPoolEdxecutor,请使用
ExecutorService.isShutdown()
如果此执行程序已关闭,则返回true
答案 2 :(得分:5)
我们在这里谈论的是Oracla Javas ThreadPoolExecutor(实现Executor接口)。在那里,关闭shutdown的方法注释没有明确禁止将 Shutdown 转换回 Running ,但是类注释列出了ThreadPoolExecutors支持的所有转换,并且无法从关闭。返回需要另一种方法 restart / start 或类似方法。这不存在,但是发现它有用的人可以扩展接口并在关闭后实现重新启动而不会破坏关闭语义。这样做可能会有点困难,因为关闭本身并不能保证最终处理停止。所以工人可以继续,直到他们完成,如果他们完成。与仅创建另一个执行程序相比,在这些情况下重新启动可能不值得额外的工作。