当前位置: 首页 > 知识库问答 >
问题:

线程池执行器关闭API文档措辞“不等待”

涂煌
2023-03-14

在ThreadPoolExector#关闭的留档中,它说:

此方法不会等待以前提交的任务完成执行

那是什么意思?

因为我认为这意味着已经提交的排队任务可能无法完成,但事实并非如此;请参阅以下示例代码,该代码在启动所有提交的任务之前调用shutdown:

package example;

import java.util.concurrent.*;

public class ExecutorTest {

    public static void main(String ... args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            final int count = i;
            executorService.execute(() -> {
                System.out.println("starting " + count);
                try {
                    Thread.sleep(10000L);
                } catch (InterruptedException e) {
                    System.out.println("interrupted " + count);
                }
                System.out.println("ended " + count);
            });
        }
        executorService.shutdown();         
    }    
}

其中打印:

C:\>java -cp . example.ExecutorTest
starting 0
starting 2
starting 1
ended 2
ended 0
starting 3
starting 4
ended 1
starting 5
ended 3
ended 5
ended 4
starting 7
starting 6
starting 8
ended 7
ended 6
ended 8
starting 9
ended 9

C:\>

在这个例子中,很明显提交的任务是完全执行的。我在JDK8上用Oracle和IBMJDK运行了这个,得到了同样的结果。

那么文档中的这一行想说什么呢?还是有人为shutdownNow写了这篇文章,并无意中将其剪切粘贴到文档中以便关机?

共有2个答案

谷彦君
2023-03-14

关闭()的javadoc的完整引用:

启动有序关闭,执行之前提交的任务,但不接受新任务。如果已经关闭,调用没有额外效果。

此方法不会等待以前提交的任务完成执行。使用Wait Termination(等待终止)来执行此操作。

关闭执行程序可防止提交新任务。

已提交的任务(无论是已启动还是仍在队列中等待)将完成执行。

如果不想执行排队的任务,请调用shutdownNow():

尝试停止所有正在执行的任务,停止正在等待的任务的处理,并返回正在等待执行的任务的列表。从该方法返回时,这些任务将从任务队列中排出(删除)。

此方法不会等待正在执行的任务终止。使用waitTershtml" target="_blank">ion来执行此操作。

除了尽最大努力尝试停止处理正在积极执行的任务之外,没有其他保证。此实现通过线程取消任务。中断(),因此任何无法响应中断的任务都可能永远不会终止。

已启动的任务是否停止取决于任务,如最后一段所述。

何甫
2023-03-14

ThreadPoolExector#关闭的文档中,还有一句话:

此方法不等待先前提交的任务完成执行。使用waitTersion来做到这一点。

在这种情况下,这意味着调用方线程不会等待以前提交的任务完成执行。换句话说,shutdown()不会阻止调用线程。

如果确实需要阻止调用线程,请使用ThreadPoolExector#awaitTermination(长超时,时间单位):

阻塞,直到所有任务在关闭请求后完成执行,或超时发生,或当前线程中断,以先发生的为准。

 类似资料:
  • 我正在使用线程池执行器更改遗留设计。详情如下:- 遗留:-对于遗留设计,在应用程序启动时创建600个线程。和放置在各种池中,然后在需要时提取这些池,并将任务分配给相应的线程。 新:-在新设计中,我将线程池替换为执行器服务 我观察到的是,对于Executor,在启动时不会创建线程。它们是在从客户端激发请求时创建的。因此,与前一个线程相比,在内存中创建的线程要少得多。 但我的问题是,这样做是否正确,因

  • 问题内容: 这是我的代码段。 现在做完之后 我要在这里实现的是,我要等待线程池中的所有线程完成执行,然后关闭执行器。 但是我想这不是这里正在发生的事情。主线程似乎正在执行关闭,它只是关闭了所有内容。 在我的线程池大小为2之前,我做了以下事情,而且似乎可行。 我如何在线程池中使用更多线程?谢谢。 问题答案: 您通常使用以下成语: 只是说执行者不会接受新工作。 等待直到所有已提交的任务完成它们的工作(

  • 目前,我正在使用一个围绕脚本共享的执行器服务的全局实例。我的想法是调用并将任务添加到池中,以便线程进行工作,当所有线程都完成时,然后写入输出文件以获取结果。 下面是一个小视图:主线程调用t0、t1、t2、t3,t0调用t4、t5。其他线程也可以调用其他线程。 问题是shutdown()和awaitTermination()在t0、t1、t2、t3时被调用并完成,而没有等待t4和t5。因此,当t4和

  • 根据ThreadPoolExecutor文档(Java ThreadPoolExecutor),如果我像这样创建一个executor服务: 当#线程

  • 我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- > 如果有理想的线程,并且随着任务的到来,将该任务分配到队列中,而不是将其添加到队列中。 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了线程池执行程序的java 1.5版本的执行方法。 新守则如下:- 遗留代码如下所示:- 现在正

  • Java SE6文档中的ThreadPoolExecutor类具有以下方法: 返回正在积极执行任务的线程的大致数目。 这里近似和积极执行是什么意思? 在调用之前、期间和之后,是否保证 null 我已经研究了线程池执行器监视需求,以及如何在java中判断线程池中是否有可用的线程,但它们没有回答我的查询。