【发布时间】:2015-11-10 16:22:20
【问题描述】:
我有以下包装器,它公开了ExecutorService 的awaitTermination 方法
public class AwaitableTermination {
protected final ExecutorService executorService;
public AwaitableTermination(ExecutorService executorService) {
this.executorService = executorService;
}
public boolean awaitTermination(long timeout) throws InterruptedException {
return executorService.awaitTermination(timeout, TimeUnit.MILLISECONDS);
}
}
典型输入为 500 毫秒。用户了解这些时间是近似值。
我对扩展AwaitableTermination 的CompositeAwaitableTermination 类有一个新要求,其中包含ExecutorService 对象的列表。如果所有ExecutorService 对象在输入时间范围内终止,awaitTermination 应该返回true,否则false。
我可以将每个ExecutorService 的awaitTermination 放在自己的线程中,但这似乎非常浪费,更不用说不精确了(不能保证所有线程都会及时执行)。
一种可能的单线程方法是遍历ExecutorServices 并根据每个对象减少超时
private final List<ExecutorService> services;
public boolean awaitTermination(long timeout) throws InterruptedException {
Queue<ExecutorService> queue = new ArrayDeque<>(services);
long start = System.currentTimeMillis();
boolean result = true;
ExecutorService service = null;
while(result && (service = queue.poll()) != null) {
long currentTimeout = timeout - (System.currentTimeMillis() - start);
if(currentTimeout > 0) {
result = service.awaitTermination(currentTimeout, TimeUnit.MILLISECONDS);
} else {
result = false;
}
}
return result;
}
但是,这种方法让我觉得对于 ExecutorServices 的较大集合非常容易出错(目前我预计 services 集合中的对象不超过 4 个,但我不想这样做依赖这个假设)。有没有更精确/优雅的方法来做到这一点?
【问题讨论】:
标签: java multithreading time executorservice