rai*_*pak 0 java multithreading thread-safety
shutdown() 的 Java 文档说:
关闭
无效关闭()
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用不会产生任何附加效果。该方法不等待之前提交的任务完成执行。使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
对shutdownNow()或 的调用shutdown()不会被阻塞。这就是文档中提到的内容。因此,如果您致电 shutdown()或shutdownNow(),您会立即恢复控制权,而不仅仅是在一切正常关闭之后。如果您想在调用 后等待所有执行程序/线程终止shutdown[Now](),则必须调用awaitTermination(...),这将阻塞直到所有内容都被清理干净。这可能就是您想要的。另请参阅此处类似问题的答案:Executor Service shutdown 和 shutdownNow 之间的差异
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |