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) 如果你想让遗嘱执行人关门,那么是的。