我正在尝试使用 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/