.awaitTermination()是否在执行程序中完成工作之前发生了?

时间:2015-06-02 19:48:12

标签: java concurrency executorservice memory-barriers happens-before

问题我已经多年了: 在这个伪代码中,

ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
    // code B
未记录

.awaitTermination(),因为在代码A&之间建立发生在之前B. 有没有理由不

ExecutorServiceconcurrent package javadocs定义之前发生发生之前工作之前发生成功.awaitTermination()电话后的代码。

请注意,我不是要求设计批评如何重构我的代码以利用记录的事先关系。我的问题是,在这种情况下,有没有理由说文档没有提及?

(请注意,尽管标题非常贴切,但这并不是22665198的重复。)

2 个答案:

答案 0 :(得分:2)

ExecutionService,你确定吗?你是说ExecutorService吗?此外,没有参数的ExecutorService.awaitTermination()方法。 ExecutorService.awaitTermination(long, TimeUnit)方法接收等待超时的时间量。显然,如果由于超时而返回,则无法保证之前发生的关系,因此无法在合同中宣传此保证,因为并非适用于所有情况。

答案 1 :(得分:-1)

实际上你错了,因为它被记录了

  

阻止所有任务在>关闭请求或超时发生后完成执行,或者>当前线程被中断,以先发生者为准。

因此可以保证任何任务都将被完成或超时发生。我们只需要通过检查awaitTermination方法的返回值来区分这些情况。如果任务完成,那将是真的。如果超时或中断,则为假。