2014-10-28 72 views
1

需要澄清以下行为。了解java执行程序服务关闭并等待终止

我有Java应用程序与java.util.concurrent.ExecutorService如下,

 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

请经常阅读,并试图了解的JavaDoc您正在使用的所有方法。 – 2014-10-28 09:30:24

+0

在await Termination中的“终止”是指线程池的终止,而不是任务的终止,因为这主要是考虑到一个新的任务可以随时出现的场景。 – lbalazscs 2014-10-28 13:21:04

回答

1

ExecutorService.awaitTermination的Javadoc说:

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

所以,当你调用shutdown():你的线程在10分钟内完成。然后等待终止立即返回(无需等待15分钟通过)。

但是如果去掉调用shutdown()方法,也没有关闭请求,所以awaitTermination不会返回,直到超时的推移(15分钟)

0

ExecutorService将立即开始交给他的所有任务。

ExecutorService#shutdown将导致ExecutorService停止接受新任务并完成工作(开始所有以前提供的任务,直到现在还没有开始)。

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

在您的方案,而无需调用shutdown()您到awaitTermination()调用将阻塞的,提供的时间全额,因为Executor本身会等待新的工作,直到永远。

1

ExecutorService.awaitTermination方法状态的Javadoc:

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