我已经问了多年的问题:
在这个伪代码中,
ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
// code B
没有将
.awaitTermination()
记录为在代码A和B之间建立之前。是否有原因?ExecutorService和concurrent package javadocs定义发生在任务和提交之前完成的工作之间的发生,而不是发生在成功
.awaitTermination()
调用之后的执行器任务和代码之间的发生。请注意,我并不是在要求对如何重组代码以利用记录的“先发生后发生”关系进行设计批评。我的问题是,在这种情况下,文档没有提及发生的原因吗?
(请注意,尽管标题很贴切,但这不是22665198的副本。)
最佳答案
ExecutionService
,您确定吗?您是说ExecutorService
吗?另外,没有没有参数的ExecutorService.awaitTermination()
方法。 ExecutorService.awaitTermination(long, TimeUnit)
方法接收等待直到超时的时间。显然,如果由于超时而返回,则不能保证事前发生的关系,因此不能在契约(Contract)中通告此保证,因为并非在所有情况下都存在。