10

我多年来一直有的问题:在这个伪代码中,

ExecutorService svc = Executors.newFixedThreadPool(3);
svc.submit(new Runnable() { /* code A */ });
svc.shutdown();
if(svc.awaitTermination(...)) {
    // code B

.awaitTermination()没有记录为在代码 A 和 B 之间 建立之前发生的事情。有没有理由不这样做

ExecutorService并发包javadocs 在任务和提交之前完成的工作之间定义了happens - before,而不是在成功调用之后的执行器任务和代码之间。.awaitTermination()

请注意,我并不是要求对如何重构我的代码以利用记录在案的发生前的关系进行设计批评。我的问题是,在这种情况下,文档没有提到发生之前是否有原因?

(请注意,这不是22665198的副本,尽管标题非常贴切。)

4

2 回答 2

2

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

于 2015-06-02T20:03:27.397 回答
-1

实际上,您错了,因为它已记录在案

阻塞直到所有任务在>关闭请求后完成执行,或发生超时,或>当前线程被中断,以先发生者为准。

因此可以保证任一任务都将完成或超时。问题是我们只需要通过检查awaitTermination方法的返回值来区分这些情况。如果任务完成,这将是真实的。如果超时或中断,则为 False。

于 2015-06-03T00:33:52.557 回答