shutdown()的Java文档说:
关闭
void 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);
}
}
答案 0 :(得分:3)
对shutdownNow()
或shutdown()
的呼叫没有阻塞。那就是在文档中提到的。
因此,如果您调用shutdown()
或shutdownNow()
,则不仅在一切正常关闭之后,还可以立即获得控制权。如果要在调用shutdown[Now]()
之后等待所有执行程序/线程终止,则必须调用awaitTermination(...)
,它将阻塞直到所有内容都清除为止。这可能就是您想要的。也可以在这里查看类似问题的答案:Difference between shutdown and shutdownNow of Executor Service