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

tar*_*sbl 10 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
Run Code Online (Sandbox Code Playgroud)

.awaitTermination()没有记录在代码A和B之间发生的事情. 有没有理由不是

ExecutorService的concurrent包的javadoc定义的之前发生完成的任务和工作之间之前,他们已提交,但不执行的任务和代码之间的成功后.awaitTermination()调用.

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

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

Ser*_*nin 2

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

  • 为什么 Javadoc 不能说 *如果此调用正常返回,它会建立发生在排序之前*? (4认同)
  • @SergeyPetunin 你会说 Lock 的 `tryLock` 没有建立在排序之前发生吗?https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html#tryLock%28long,%20java.util.concurrent.TimeUnit%29 (2认同)