我有以下示例代码,假设MyCallable("B")
执行时间超过一秒,而其他代码执行速度超过一秒。因此在我调用的循环中Future.get()
,它会抛出一个TimeoutException
.
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(2);
List<Future<String>> futures = new ArrayList<Future<String>>();
futures.add(es.submit(new MyCallable("A")));
futures.add(es.submit(new MyCallable("B")));
futures.add(es.submit(new MyCallable("C")));
futures.add(es.submit(new MyCallable("D")));
futures.add(es.submit(new MyCallable("E")));
try {
for(Future<String> f : futures) {
try {
System.out.println("result " + f.get(1, TimeUnit.SECONDS));
}
catch (TimeoutException e) {
// how do I know which MyCallable() has timed out?
} catch (ExecutionException e) {
System.out.println(e.getMessage());
}
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
es.shutdown();
}
}
正如预期的那样,每个 MyCallable() 实例都会执行,但是对于超时的实例,我想执行一些错误处理,这需要知道哪个Callable
与哪个关联Future
。
是否有这种关联的机制,还是由我Callable
来处理它的方法内的所有错误处理call()
?