我多年来一直存在的问题: 在此伪代码中,
ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
// code B
.awaitTermination()
没有被记录为在代码 A 和 B 之间建立happens-before。它不是的原因是什么 ?
ExecutorService和 concurrent package javadocs 定义了happens-before在任务和完成的工作之间它们被提交,但在执行者任务和成功.awaitTermination()
之后的代码之间没有定义> 打电话。
请注意,我并不是要就如何重构我的代码以利用记录在案的发生前关系提出设计批评。我的问题是,在这种情况下,文档没有提到 happens-before 是有原因的吗?
(请注意,这不是 22665198 的副本,尽管标题非常贴切。)
最佳答案
ExecutionService
,你确定吗?您是说 ExecutorService
吗?此外,没有不带参数的 ExecutorService.awaitTermination()
方法。 ExecutorService.awaitTermination(long, TimeUnit)
方法接收等待超时的时间量。显然,如果它因为超时而返回,它不能保证 happens-before 关系,因此它不能在其合约中宣传这种保证,因为它并非适用于所有情况。
关于java - .awaitTermination() 是否在执行程序中完成工作之前建立 happens-before?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30605289/