我试图使用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);
}
}