Java 遗嘱执行人是否意味着可以重复使用?

Java 遗嘱执行人是否意味着可以重复使用?,java,concurrency,executorservice,java.util.concurrent,Java,Concurrency,Executorservice,Java.util.concurrent,执行器对象是否打算在关闭后重新使用?我的意思是,如果在执行器终止后调用shutdown或shutdownNow,我应该执行new来创建一个新的线程池,还是可以以某种方式“重置”/重用先前终止的执行器并重用它 更新: 如果需要创建新的线程池,如何“理解”上一个线程池已停止? 例如。 以下是: public void startPool(){ if(threadPool != null && !threadPool.isShutdown()){ return;

执行器对象是否打算在
关闭后重新使用?我的意思是,如果在执行器终止后调用
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
,由于条件原因,将不会创建新的线程池。编写此代码的正确方法是什么?

来自:

终止后,执行人没有正在执行的任务,没有 等待执行的任务,不能提交新任务

所以(简而言之),不,你不能重复使用它。发件人:

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

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

1)关闭ThreadPoolExecutor后不能再使用它,API

An ExecutorService can be shut down, which will cause it to reject new tasks
注意:如果要重用ThreadPoolExecutor,请不要关闭它

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

ExecutorService.isShutdown()

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

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

这不应该是
…&&!threadPool.isShutdown()
所以只有在TP仍在运行(即启动)时才提早返回?@RalfH:说得好!更新了OPOK,您从同一线程调用
停止
,然后调用
开始
。@RalfH:从同一线程调用是,那么它应该可以工作。子类化您的TPE并覆盖
onShutton()
terminated()
以提供一些日志记录。基本上,我需要在
stop
中执行
threadPool=null
对吗?这会是个问题吗?不,threadPool=Executors.newCachedThreadPool();100%就够了吗