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

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的副本。)

最佳答案

ExecutionService,您确定吗?您是说ExecutorService吗?另外,没有没有参数的ExecutorService.awaitTermination()方法。 ExecutorService.awaitTermination(long, TimeUnit) 方法接收等待直到超时的时间。显然,如果由于超时而返回,则不能保证事前发生的关系,因此不能在契约(Contract)中通告此保证,因为并非在所有情况下都存在。

10-04 12:54