ThreadPoolExecutor, Futures:关联请求和响应



我试图使用ThreadPoolExecutor以及Future(结果)和Callable(要执行的任务),但我无法找出一种简单的方法将输入(Callable)与相应的结果(Future)相关联,似乎唯一明智的方法是创建一个包含所有项目的包装器(示例),但这可能是太多的开销对于这样一个简单的任务。

我错了吗?有什么建议吗?

更好的方法是使用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);
    }
}

最新更新