다음 예제 코드가 있는데 다른 하나가 1 초보다 빨리 실행될 때 MyCallable("B")
이 1 초보다 오래 걸린다 고 가정 해 봅시다. 따라서 Future.get()
을 호출하는 루프 내에서 TimeoutException
이 발생합니다. MyCallable 각각의 예상대로ExecutorService 및 Futures를 사용하여 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();
}
}
() 인스턴스를 실행할 수 있지만, 시간이 초과 내가 몇 가지 오류 처리를 수행하고자하는 하나이는 Callable
이있는 Future
와 연관된 아는이 필요합니다.
이 연관을위한 메커니즘이 있습니까? call()
메서드 내에서 모든 오류 처리를 처리하려면 내 Callable
까지입니까?
'Map, Callable > '을 사용하는 것이 가장 간단한 옵션이며 작동합니다 –
Brad