了解java executor服务shutdown和awaitTermination

时间:2014-10-28 09:18:06

标签: java java.util.concurrent

需要澄清以下行为。

我有一个java.util.concurrent.ExecutorService的Java应用程序,如下所示,

       for (int i = 0; i < thread_count; i++) {
            Runnable worker = new MyThread(batchSize);
            executor.execute(worker);
        }

        executor.shutdown();
        executor.awaitTermination(15, TimeUnit.MINUTES);
        System.out.println("All threads are finished");

在上面的代码中,我有5个线程,这些线程在10分钟内完成,它将执行System.out.println("All threads are finished"),即使executor.awaitTermination(15, TimeUnit.MINUTES)有15分钟的等待时间。

但是当我删除executor.shutdown()时,程序会在执行下一行之前等待15分钟(在executor.awaitTermination(15, TimeUnit.MINUTES)语句中指定)。

任何人都可以解释这种行为吗?为什么没有shutdown命令会等待所有线程完成后指定的时间量?

3 个答案:

答案 0 :(得分:1)

ExecutorService.awaitTermination方法的Javadoc声明:

  

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

答案 1 :(得分:1)

ExecutorService.awaitTermination的Javadoc说:

  

阻止所有任务在关机请求完成后执行,或发生超时,或当前线程为   中断,以先发生者为准

因此,当您调用shutdown()时:您的线程将在10分钟内完成。然后awaitTermination立即返回(不等待15分钟通过)。

但是如果删除对shutdown()的调用,则没有关闭请求,因此awaitTermination在超时超过(15分钟)之前不会返回

答案 2 :(得分:0)

ExecutorService将立即启动所有移交给他的任务。

ExecutorService#shutdown将导致ExecutorService停止接受新任务并完成工作(启动之前未提供的所有先前提供的任务)。

ExecutorService#awaitTermination的参数是超时,这个调用在强制返回之前阻塞的时间。

在未调用shutdown()的情况下,您对awaitTermination()的调用将阻止全部供应时间,因为Executor本身将等待新工作。