我有以下包装器,它公开 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 个) ,但我不想依赖这个假设)。有没有更精确/优雅的方法来做到这一点?
最佳答案
我认为这段代码没有问题。
如果您有大型集合(例如 100k+)ExecutorService
,您应该更关心实际的线程数!
awaitTermination
如果服务已经关闭或者没有待处理的任务,则根本不需要时间,并且如果您有大量 ExecutorService 正在运行,则很可能是这种情况,否则您的系统应该已经受到影响。因此,即使对于大型集合,此代码也不应该有任何问题。
关于java - 在固定的时间段内等待多个 ExecutorServices 的终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060418/