shutdown() 的 Java 文档说:
shutdown
无效关闭()
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用不会产生任何附加效果。
该方法不等待之前提交的任务完成执行。使用awaitTermination 来做到这一点。
这两种说法不是矛盾吗? (...之前提交的任务执行完毕VS不等待之前提交的任务完成执行)?
我尝试了一个示例程序shutdown()
。与之前提交的任务不同,它会等待之前提交的任务完成shutdownNow()
!
为什么下面的代码会返回I have shutdown true
什么时候应该等待阶乘任务完成?
public class RunnableMain {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
RunnableFactorialTask runnableFactorialTask = new RunnableFactorialTask(5);
executor.submit(runnableFactorialTask);
executor.shutdown();
System.out.println(" I have shutdown.."+executor.isShutdown());
}
}
class RunnableFactorialTask implements Runnable {
private int num = 0;
public RunnableFactorialTask(int num) {
this.num = num;
}
@Override
public void run() {
int factorial = 1;
try {
Thread.currentThread().sleep(6000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 2; i <= num; i++) {
factorial *= i;
}
System.out.println("factorial of :" + num + " =" + factorial);
}
}
致电shutdownNow()
or shutdown()
没有阻塞。这就是文档中提到的内容。
所以如果你打电话shutdown()
or shutdownNow()
,您可以立即恢复控制权,而不仅仅是在一切正常关闭之后。如果您想在调用后等待所有执行程序/线程终止shutdown[Now]()
,你必须打电话awaitTermination(...)
,它将阻塞,直到所有内容都被清理干净。这可能就是您想要的。另请参阅此处类似问题的答案:Executor Service的shutdown和shutdownNow的区别 https://stackoverflow.com/questions/11520189/difference-between-shutdown-and-shutdownnow-of-executor-service
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)