ThreadPoolExecutor 关闭 API 文档措辞“不等待”

在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:\>

在这个例子中,提交的任务完成执行似乎很清楚。我已经在带有 Oracle 和 IBM JDK 的 JDK8 上运行它并得到相同的结果。


那么文档中的那一行是什么意思?还是有人为shutdownNow编写了这个并将其剪切n粘贴到文档中以不经意间关闭?


不负相思意
浏览 183回答 2
2回答

宝慕林4294392

的 javadoc 的完整引用shutdown():启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用没有额外的效果。此方法不等待先前提交的任务完成执行。使用awaitTermination这样做。关闭执行程序可防止提交新任务。已经提交的任务,无论是开始还是在队列中等待,都会完成执行。如果您不想执行排队任务,请调用shutdownNow():尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。从该方法返回后,这些任务将从任务队列中排出(移除)。此方法不会等待主动执行的任务终止。使用awaitTermination这样做。除了尽力尝试停止处理正在执行的任务之外,没有任何保证。此实现通过 取消任务Thread.interrupt(),因此任何未能响应中断的任务可能永远不会终止。已启动的任务是否停止取决于任务,如最后一段所述。

慕运维8079593

在 的文档中ThreadPoolExector#shutdown,还有一句:此方法不等待先前提交的任务完成执行。使用 awaitTermination 来做到这一点。在这种情况下,这意味着调用者线程不会等待先前提交的任务完成执行。换句话说,shutdown()不会阻塞调用者线程。如果您确实需要阻止调用者线程,请使用ThreadPoolExector#awaitTermination(long timeout, TimeUnit unit):阻塞直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程被中断,以先发生者为准。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java