Как «отменить» CountDownLatch?

У меня есть несколько потребительских потоков, ожидающих CountDownLatchразмера 1 с использованием await(). У меня есть единственный поток производителя, который вызывает countDown()после успешного завершения.

Это прекрасно работает, когда ошибок нет.

Однако, если производитель обнаруживает ошибку, я хотел бы, чтобы он мог сигнализировать об ошибке потокам-потребителям. В идеале я мог бы сделать так, чтобы производитель вызывал что-то вроде abortCountDown(), а все потребители получали InterruptedException или какое-то другое исключение. Я не хочу вызывать countDown(), потому что это требует, чтобы все мои потоки-потребители выполняли дополнительную ручную проверку на успешность после их вызова await(). Я бы предпочел, чтобы они просто получили исключение, которое они уже знают, как обрабатывать.

Я знаю, что средство прерывания недоступно в CountDownLatch. Есть ли другой примитив синхронизации, который я могу легко адаптировать для эффективного создания CountDownLatch, поддерживающего прерывание обратного отсчета?

16
задан Gray 4 May 2012 в 18:19
поделиться