java - ThreadPoolExecutor, future : correlating requests and responses

标签 java multithreading threadpool future threadpoolexecutor

我正在尝试使用 ThreadPoolExecutor以及Future (结果)和 Callable (要执行的任务),但我无法找出将输入(Callable)与相应结果(Future)相关联的简单方法,似乎唯一明智的方法是创建一个包装器( example ),其中包含所有项目,但这对于这样一个简单的任务来说可能太大了。

我错了吗?有建议的替代方案吗?

最佳答案

更好的方法是使用 invokeAll() 方法而不是 submit()。您需要向其提供一个 Callable 集合,它将按照与您的任务相同的顺序返回一个 Futures 集合。此外,invokeAll() 允许您定义超时,因此您不需要闩锁。它会是这样的:

List<Callable> jobs = new ArrayList<>(requests.size());
for (String request : requests) {
    jobs.add(new MyCallable(request));
}
List<Future<ProcessedResponse>> futures = executor.invokeAll(jobs, timeout, TimeUnit.MILLISECONDS);
Iterator<String> it = requests.iterator();
for (Future<ProcessedResponse> future: futures) {
    String request = it.next();  // This request corresponds to this future
    if (future.isDone()) {
        results.add(new Result(request, future.get()));
    } else {
        future.cancel(true);
    }
}

关于java - ThreadPoolExecutor, future : correlating requests and responses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39603265/

相关文章:

java - 线程池的设计模式

java - 如何解决 Android Java 中的并发问题?

java - Tomcat 监控 - connectionCount JMX mbean

ruby - 线程池中的死锁

java - quartz 调度程序如何工作?

用于集成的 Java Portal 引擎

java - 如何知道 RecyclerView 是否有足够的内容可以滚动?

c++ - 一个结构中的条件变量、互斥锁和标志

java - 多次将对象设置为 null 是否会影响性能?

java - 是否可以在 displayMsg() 函数中访问 getVal() 函数?