Прервать countDownLatch.await() по истечении времени ожидания

Я использую ExecutorService для реализации 3-поточного пула и CountDownLatch для отслеживания завершения всех потоков для дальнейшей обработки.

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 секунд. Как я могу реализовать это?


person user2122524    schedule 06.03.2013    source источник


Ответы (1)


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

countDownLatch.await(45, TimeUnit.SECONDS);
person Perception    schedule 06.03.2013
comment
Это не работает. Это удерживает потоки в течение 45 секунд, даже если процесс был завершен за 2-3 секунды. - person user2122524; 06.03.2013
comment
Нет, он ожидает до указанного времени. Пока защелка в ваших задачах отсчитывается до нуля, она гарантированно ожидает *меньшее время завершения или тайм-аут. - person Perception; 06.03.2013
comment
@DavidDoria - действительно так и должно быть. Спасибо, что заметили это, и... исправлено. - person Perception; 24.10.2013
comment
@Perception: Знаете ли вы, работает ли защелка, если счетчик не был достигнут, но время ожидания функции ожидания () истекло? Другими словами, могу ли я тайм-аут, проверить что-то и снова вызвать метод await () и по-прежнему сигнализировать о нем с помощью «count ()» в другом потоке? - person Brian Reinhold; 23.10.2016
comment
Этот код помогает, только если код перед countDownLatch является асинхронным. Если вы поставите синхронный код - он вам не поможет. - person Kostadin; 23.05.2018