我正在使用ExecutorService运行一些Callable线程。在提交给ExecutorService之前,线程已使用数据进行初始化。
当处理Future.get()抛出的异常时,我想记录一条包含原始数据的消息。是否可以从Future对象返回到创建它的原始线程?
伪代码:
void run(List<Data> dataList) {
List<Future<Foo>> results = new ArrayList<Future<Foo>>();
for (Data data : dataList) {
Callable<Foo> thread = new FooCallable(data);
Future<Foo> result = this.executorService.submit(thread);
results.add(result);
}
...
for (Future<Foo> result : results) {
Foo foo;
try {
foo = result.get();
} catch (InterruptedException e) {
//
// I would like access to the original Data object here
//
} catch (ExecutionException e) {
//
// and here
//
}
}
}
答案 0 :(得分:0)
是否可以从Future对象返回到创建它的原始线程?
我认为您的意思是说您想要访问导致异常的Data
字段。您可以通过创建一个小容器类来完成此任务:
private static class FutureData {
final Data data;
final Future<Foo> future;
public FutureData(Data data, Future<Foo> future) {
this.data = data;
this.future = future;
}
}
然后,当您创建未来时,请将FutureData
添加到results
列表中。
List<FutureData> results = new ArrayList<FutureData>();
for (Data data : dataList) {
Callable<Foo> callable = new FooCallable(data);
Future<Foo> future = this.executorService.submit(callable);
results.add(new FutureData(data, future));
}
然后你可以这样做:
for (FutureData futureData : results) {
Foo foo;
try {
foo = futureData.future.get();
} catch (Exception e) {
// use futureData.data here
...
答案 1 :(得分:0)
使用地图而不是列表来存储您的期货及其相应数据,并将期货作为关键字用于该地图:
Map<Future<Foo>,Data> results = new HashMap<Future<Foo>,Data>();
for (Data data : dataList) {
Callable<Foo> thread = new FooCallable(data);
Future<Foo> result = this.executorService.submit(thread);
results.put(result,data);
}
Iterator<Map.Entry<Future<Foo>,Data>> resultsIterator = results.entrySet().iterator();
while(resultsIterator.hasNext()) {
Map.Entry<Future<Foo>,Data> entry = resultsIterator.next();
Future<Foo> future = entry.getKey();
Data data = entry.getValue();
Foo foo;
try {
foo = future.get();
} catch (InterruptedException e) {
//data accessible here
} catch (ExecutionException e) {
//data accessible here too
}
}