java - .awaitTermination() 是否在执行程序中完成工作之前建立 happens-before?

标签 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 之间建立happens-before它不是的原因是什么

ExecutorServiceconcurrent 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/

相关文章:

java - 在 quartz 调度程序中以固定延迟安排?

c# - 具有基于 XML 的存储的 WCF 服务。并发问题?

Java 并发计数器未正确清理

java - Java ExecutorService shutdownNow现在不中断

java - 此 sql 查询的 jpql 等效项(从国家字符查询)

java - 在从客户端发送到服务器的字符串中识别 "\r\n.\r\n"

编译器对临时变量的 Java 优化

客户端-服务器应用程序上的 Linux 套接字输入通知

java - ExecutorService线程安全

multithreading - Java8 ForkJoinPool 和 Executors.newWorkStealingPool 的详细区别?