Ami*_*bha 37 java multithreading executorservice
有什么区别
ExecutorService eService = Executors.newFixedThreadPool(2);
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.execute(new TestThread6());
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
eService.shutdown();
Run Code Online (Sandbox Code Playgroud)
和
eService.shutdown();
eService.awaitTermination(1, TimeUnit.NANOSECONDS);
Run Code Online (Sandbox Code Playgroud)
我真的不明白shutdown().此方法不会等待先前提交的任务完成执行.这是否意味着shutdown()可以终止已提交但未完成的任务?我尝试了一些例子,他们没有证明,请举个例子.
Chr*_*ung 49
你应该先打个电话shutdown.否则,您可能会等待很长时间,因为awaitTermination实际上并没有关闭执行程序.
如果您想等待任务完成,而不是等待执行程序关闭,那么您应该使用invokeAll.
S.D*_*.D. 40
阅读文档总是有帮助的:
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表.从此方法返回时,这些任务将从任务队列中排空(删除).
此方法不等待主动执行任务终止. 使用awaitTermination来做到这一点.
除尽力尝试停止处理主动执行任务之外,没有任何保证.此实现通过Thread.interrupt()取消任务,因此任何无法响应中断的任务都可能永远不会终止
关机:
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务.如果已经关闭,调用没有其他影响.
此方法不会等待先前提交的任务完成执行.使用
awaitTermination这样做.
阻止所有任务在关闭请求之后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准.
Ter*_* Li 13
shutdown表示执行程序服务不再执行传入任务.
在关闭请求之后调用awaitTermination.
您需要先关闭服务然后阻塞并等待线程完成.
如果要查看所有线程是否已完成运行并坚持使用awaiTermination,则需要将timeout参数设置得足够大.所以你可以这样做:
eService.shutdown();
if (!eService.awaitTermination(60000, TimeUnit.SECONDS))
System.err.println("Threads didn't finish in 60000 seconds!");
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以这样做:
eService.shutdown();
while (!eService.isTerminated()) {
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以确保所有线程都已完成运行,除非它们意外中断.
小智 8
最佳实施:
executor.shutdown();
try {
if (!executor.awaitTermination(3500, TimeUnit.MILLISECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
Run Code Online (Sandbox Code Playgroud)
主要区别
关机() -
1. Doesn't block the calling a thread i.e. the thread who called the shutdown().
2. Excecutor doesn't accept any new task after calling shutdown().
Run Code Online (Sandbox Code Playgroud)
awaitTermination() -
1. Blocks the calling thread. (as join() method do)
Run Code Online (Sandbox Code Playgroud)
困惑点:- 如果shutdown() 没有终止之前提交的任务,为什么我们需要awaitTermination()?
awaitTermination 意味着等待任务完成/终止,对吗?shutdown()正在做同样的事情 - 等待已经与正在运行的任务一起提交的任何任务继续直到完成/终止,那么为什么要使用另一种方法awaitTermination(..)?下面是解释:
假设您只能等待10 分钟才能完成所有提交的任务,然后想调用shutdownNow()(---您已经知道它是做什么的)然后awaitTermination(long timeout, TimeUnit unit)在调用 shutdown() 后使用。
注意 中的方法参数awaitTermination(long timeout, TimeUnit unit)。这个超时是这里的关键。
如果没有时间限制,shutdown() 就可以了。不需要 awaitTermination()。