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%就够了吗