shutdown和awaitTermination哪个第一次调用有什么区别?

有什么区别

ExecutorService eService = Executors.newFixedThreadPool(2); eService.execute(new TestThread6()); eService.execute(new TestThread6()); eService.execute(new TestThread6()); eService.awaitTermination(1, TimeUnit.NANOSECONDS); eService.shutdown(); 

 eService.shutdown(); eService.awaitTermination(1, TimeUnit.NANOSECONDS); 

我真的不了解shutdown() 。 此方法不会等待先前提交的任务完成执行。 这是否意味着shutdown()可以终止已提交但未完成的任务? 我尝试了一些例子,他们没有certificate,请举个例子。

你应该先打电话给shutdown 。 否则,您可能需要等待很长时间,因为awaitTermination实际上并没有关闭执行程序。

如果您想等待任务完成,而不是等待执行程序关闭,那么您应该使用invokeAll

阅读文档总是有帮助的:

shutdownNow

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

此方法不等待主动执行任务终止。 使用awaitTermination来做到这一点。

除了尽力尝试停止处理主动执行任务之外,没有任何保证。 此实现通过Thread.interrupt()取消任务,因此任何无法响应中断的任务都可能永远不会终止

关机 :

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。

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

awaitTermination :

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

shutdown表示执行程序服务不再执行传入任务。

在关闭请求之后调用awaitTermination 。

您需要先关闭服务然后阻止并等待线程完成。

如果要查看所有线程是否已完成运行并坚持使用awaiTermination ,则需要将timeout参数设置得足够大。 所以你可以这样做:

 eService.shutdown(); if (!eService.awaitTermination(60000, TimeUnit.SECONDS)) System.err.println("Threads didn't finish in 60000 seconds!"); } 

或者,您可以这样做:

 eService.shutdown(); while (!eService.isTerminated()) { } 

这样,您可以确保所有线程都已完成运行,除非它们意外中断。

在我们启动第一个任务后,ThreadPoolExecutor将启动一个即使在任务完成后也不会结束的线程。 至少对于固定的线程池是这样的。 这就是我们需要调用shutdown的原因。 关闭后,ThreadPoolExecutor将拒绝任何新任务,但将等待运行任务完成,然后允许线程结束。 这就是我们在shutdwon之后需要awaitTermination的原因。

在awaitTermination()方法调用发生后,您需要调用shutdownNow()方法。 然后,只有你可以找出awaitTermination()方法的实际用法