2013-04-06 2 views
0

Второй поток в моем коде будет генерировать исключение divide на 0, но я поймаю его только после завершения первого потока. Первый поток может работать в течение нескольких дней, поэтому это означает, что через несколько дней я поймаю свое исключение. Могу ли я решить это так или иначе без подкласса ThreadPoolExecutor и переопределить afterExecute?Как поймать ошибки мгновенно при запуске нескольких потоков с исполнителями?

Вот мой код:

ExecutorService executor = Executors.newCachedThreadPool(); 

    Future<Integer> future = executor.submit(new MyTestC(4000)); 
    Future<Integer> future2 = executor.submit(new MyTestC(0)); 

    ArrayList<Future<Integer>> futures = new ArrayList<>(); 
    futures.add(future); futures.add(future2); 

    for(Future<Integer> f: futures) 
    { 
     try { 
      int result = f.get(); 
      System.out.println(result); 
     } catch (InterruptedException | ExecutionException e) { 
      e.printStackTrace(); 
     } 
    } 

class MyTestC implements Callable<Integer> { 

int sleep; 

public MyTestC(int sleep) 
{ 
    this.sleep = sleep; 
} 

@Override 
public Integer call() throws Exception { 
    if(sleep > 0) 
     Thread.sleep(sleep); 

    //If 0 will throw exception: 
    int tmp = 4/sleep; 

    return sleep; 
} 

}

ответ

2

вы можете использовать ExecutorCompletionService, чтобы решить эту проблему. он вернет фьючерсы в том порядке, в котором они будут завершены.

+0

Nice, TIL о 'ExecutorCompletionService'. +1. –