Java 关闭Executor服务
根据,当调用Java 关闭Executor服务,java,multithreading,interrupted-exception,Java,Multithreading,Interrupted Exception,根据,当调用shutdown()时,将执行已提交的任何任务(我假设通过submit()或execute)。调用shutdownNow()时,执行器将停止所有等待处理的任务,并尝试停止主动执行任务 我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行器,我对一些Runnable对象调用execute()。我知道,如果我现在调用shutdown,所有这些对象都将完成执行,不管如何 但是,如果我在此时调用shutdownow,它是否与调用shutdown具有相同的效果?或者有些对象没有执行?换句
shutdown()
时,将执行已提交的任何任务(我假设通过submit()
或execute
)。调用shutdownNow()
时,执行器将停止所有等待处理的任务,并尝试停止主动执行任务
我想澄清的是“等待处理”的确切含义。例如,假设我有一个执行器,我对一些Runnable
对象调用execute()。我知道,如果我现在调用shutdown
,所有这些对象都将完成执行,不管如何
但是,如果我在此时调用shutdownow
,它是否与调用shutdown
具有相同的效果?或者有些对象没有执行?换句话说,如果我希望执行器尽快退出,那么我的最佳选择是否总是调用shutdownNow()
,即使传递给执行器的可运行文件实际上都忽略了中断
我想澄清的是“等待处理”的确切含义
它表示其run()
方法尚未(由执行者)调用的所有任务
如果我在此时调用shutdownNow,其效果是否与调用shutdown相同
没有
或者是否有可能某些对象不会执行
这是正确的
换句话说,如果我希望执行器尽快退出,那么我的最佳选择是否总是调用shutdownNow(),即使传递给执行器的可运行程序实际上都忽略了中断
这是正确的
更好的是,重新编码Runnables以关注中断。。。或者对关机设置一个超时…用于shutdownNow
方法的API说明:
除了尽最大努力尝试停止处理外,没有其他保证
积极执行任务。例如,典型的实现将
通过Thread.interrupt()取消,因此任何未能响应
中断可能永远不会终止
假设您有一个非常棒的可运行的
,启动后10秒钟内不可中断:
Runnable r = new Runnable() {
@Override
public void run() {
long endAt = System.currentTimeMillis() + 10000;
while (System.currentTimeMillis() < endAt);
}
};
Runnable r=newrunnable(){
@凌驾
公开募捐{
long-endAt=System.currentTimeMillis()+10000;
while(System.currentTimeMillis()
您有一个只有1个线程的执行器,您可以将可运行线程调度10次:
ExecutorService executor = Executors.newFixedThreadPool(1);
for (int i = 0; i < 10; i++)
executor.execute(r);
ExecutorService executor=Executors.newFixedThreadPool(1);
对于(int i=0;i<10;i++)
执行人。执行人(r);
现在您决定调用shutdown
:
- 执行器将持续10 x 10秒,所有计划的内容都将执行。任务没有看到您正在关闭其执行器<代码>关闭
可用于仅为少数任务使用“短期”执行器的情况。您可以立即调用shutdown
,稍后将对其进行清理
或者shutdownNow()
:
- 需要10秒。试图中断已经运行的任务,但显然没有效果,因此它将继续运行。其他9项仍在队列中等待的任务将被“取消”,并作为列表返回给您,以便您可以对它们做一些事情,比如稍后安排它们。如果第一个任务尚未启动,也可能需要0秒。你会找回所有的任务。每当您要中止整个执行器时,都会使用该方法
一个快速跟进:如果我的线程在executor.awaitTermination()
调用中被阻塞,而我被中断,具体会发生什么情况?我是否仍需要调用shutdown/shutdownow
?awaitTemination()
调用将向其调用者抛出InterruptedException
。但是请记住,当“等待”线程被中断时会发生这种情况,而不是属于executor服务的任何线程。2) 如果你想让遗嘱执行人关门,那么是的。