java - 在固定的时间段内等待多个 ExecutorServices 的终止

标签 java multithreading time executorservice

我有以下包装器,它公开 ExecutorServiceawaitTermination 方法

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 毫秒。用户了解这些时间是近似值。

我对扩展 AwaitableTerminationCompositeAwaitableTermination 类有一个新要求,其中包含 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/

相关文章:

java - 简单的数学游戏

java - XPath 2.0 中的函数 Reverse() : how can use it to evaluate an expression?

C++:创建线程的问题; error C2672: 'std::invoke': 找不到匹配的重载函数

ios - 使用后台线程从 url 加载注释。移动或缩放 map View 之前不会显示图钉

mysql - mysql中两个特定时间之间的数据出现错误

java - 向 JSF 2.0 页面回显消息

java : "Class Overloading"

ruby-on-rails - Sidekiq - 进程还是线程?什么最有效?

c++ - 这张图说明了时间复杂度是多少?

c++ - 基于单元框架的算法性能测试的可靠性