JB Nizet の素晴らしい回答がありました。私は彼を取り、それを少し磨きました。その結果、AbortableCountDownLatch と呼ばれる CountDownLatch のサブクラスが作成され、このクラスに「abort()」メソッドが追加され、ラッチを待機しているすべてのスレッドが AbortException (InterruptedException のサブクラス) を受け取るようになります。
また、JB のクラスとは異なり、AbortableCountDownLatch は、カウントダウンがゼロになるのを待つのではなく、アボート時にすべてのブロッキング スレッドを直ちにアボートします (カウント > 1 を使用する状況の場合)。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class AbortableCountDownLatch extends CountDownLatch {
protected boolean aborted = false;
public AbortableCountDownLatch(int count) {
super(count);
}
/**
* Unblocks all threads waiting on this latch and cause them to receive an
* AbortedException. If the latch has already counted all the way down,
* this method does nothing.
*/
public void abort() {
if( getCount()==0 )
return;
this.aborted = true;
while(getCount()>0)
countDown();
}
@Override
public boolean await(long timeout, TimeUnit unit) throws InterruptedException {
final boolean rtrn = super.await(timeout,unit);
if (aborted)
throw new AbortedException();
return rtrn;
}
@Override
public void await() throws InterruptedException {
super.await();
if (aborted)
throw new AbortedException();
}
public static class AbortedException extends InterruptedException {
public AbortedException() {
}
public AbortedException(String detailMessage) {
super(detailMessage);
}
}
}