需要澄清以下行为。
我有一个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命令会等待所有线程完成后指定的时间量?
答案 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
本身将等待新工作。