2013-03-06 3 views
4

Я использую ExecutorService для реализации пула с тремя потоками и CountDownLatch для контроля завершения всех потоков для дальнейшей обработки.Abort countDownLatch.await() после времени

ExecutorService threadExecutor = Executors.newFixedThreadPool(3); 
CountDownLatch countDownLatch = new CountDownLatch(3); 

AuthorisationHistoryTask task1 = 
    new AuthorisationHistoryTask(commonDataThread, countDownLatch); 
PreAuthHistoryTask task2 = 
    new PreAuthHistoryTask(userID,sessionID, commonDataThread, countDownLatch); 

SettlementHistTask task4 = new SettlementHistTask(commonDataThread,countDownLatch); 

Future<Map<String, Object>> futureAuthHistory = threadExecutor.submit (task1); 
Future<Map<String, Object>> futurePreAuthHist = threadExecutor.submit (task2); 
Future<Map<String, Object>> futureSettleHist = threadExecutor.submit(task4); 

threadExecutor.shutdown(); 

try { 
    countDownLatch.await(); 
}catch (InterruptedException e) { 
    logger.logCommon("InterruptedException",CLASS_NAME);      
}catch (ExecutionException ex) { 
    logger.logCommon("InterruptedException",CLASS_NAME); 
} 

Я использовал countDownLatch.await() ждать, пока все потоки будут завершены. Я хочу, чтобы этот процесс countDownLatch.await() прервал в случае TIME OUT 45 секунд. Как я могу это реализовать?

ответ

14

Используйте перегруженный вариант await, который допускает таймаут.

countDownLatch.await(45, TimeUnit.SECONDS); 
+0

Это не работает. Это удерживает потоки в течение 45 секунд, даже если процесс завершен через 2-3 секунды. – user2122524

+4

Нет, он не ждет *** до ** указанного времени. Пока защелка подсчитывается до нуля в ваших задачах, гарантируется, что она будет ждать * меньше * времени завершения или таймаута. – Perception

+0

Спасибо .. это сработало. – user2122524