问题我已经多年了: 在这个伪代码中,
ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
// code B
未记录 .awaitTermination()
,因为在代码A&之间建立发生在之前B. 有没有理由不?
ExecutorService和concurrent package javadocs定义在之前发生发生之前工作之前发生成功.awaitTermination()
电话后的代码。
请注意,我不是要求设计批评如何重构我的代码以利用记录的事先关系。我的问题是,在这种情况下,有没有理由说文档没有提及?
(请注意,尽管标题非常贴切,但这并不是22665198的重复。)
答案 0 :(得分:2)
ExecutionService
,你确定吗?你是说ExecutorService
吗?此外,没有参数的ExecutorService.awaitTermination()
方法。 ExecutorService.awaitTermination(long, TimeUnit)
方法接收等待超时的时间量。显然,如果由于超时而返回,则无法保证之前发生的关系,因此无法在合同中宣传此保证,因为并非适用于所有情况。
答案 1 :(得分:-1)
实际上你错了,因为它被记录了
阻止所有任务在>关闭请求或超时发生后完成执行,或者>当前线程被中断,以先发生者为准。
因此可以保证任何任务都将被完成或超时发生。我们只需要通过检查awaitTermination
方法的返回值来区分这些情况。如果任务完成,那将是真的。如果超时或中断,则为假。