ビジネスケースを Cyclic Barriers の使用法にマッピングしようとしています。プロモーション オファーが進行中で、3 人の顧客のみがプロモーション オファーを取得できるとします。残りはオファーを受けません。
このシナリオをマッピングするために、Cyclic Barrier を利用しました。コードは機能していますが、一部の顧客がオファーを受けられないというシナリオをどのように処理すればよいかわかりません。今、タイムアウト値を指定して await() API を使用しようとしました。これにより、TimeoutExceptionをキャッチして、プロモーション オファーを利用できないことを顧客に知らせることができます。これにより、別の待機中のスレッドでBarrierBrokenExceptionが発生しました。
選択した顧客がプロモーション オファーを利用できる一方で、別のコード パスをたどることができなかった顧客など、これらのシナリオを適切に処理するにはどうすればよいか知りたいです。
私のコード -
public class CyclicBarrierExample {
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
Thread[] threads = new Thread[5];
CyclicBarrier barrier = new CyclicBarrier(3, ()->{System.out.println("Barrier limit of 3 reached. 3 threads will get the promotional offer!");});
Runnable nr = new PromotionRunnable(barrier);
int i = 0;
for (Thread t : threads) {
t = new Thread(nr, "Thread " + ++i);
t.start();
}
System.out.println("main thread has completed");
}
private static class PromotionRunnable implements Runnable {
private final CyclicBarrier barrier;
public PromotionRunnable(final CyclicBarrier barrier) {
this.barrier = barrier;
}
/*
* As per the doc, BrokenBarrierException is thrown when another thread timed out while the current thread was waiting.
* This explains why we are able to see both Timeout and Broken Barrier Exceptions.
*/
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " trying to get the promotional offer!");
try {
barrier.await(2000L, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
return;
} catch (BrokenBarrierException e) {
System.out.println(Thread.currentThread().getName() + " could not get the promotional offer, due to barrier exception");
return;
} catch (TimeoutException e) {
System.out.println(Thread.currentThread().getName() + " could not get the promotional offer, due to timeout exception");
return;
}
System.out.println(Thread.currentThread().getName() + " got the promotional offer!");
}
}
}
実行の 1 つからの出力 -
- スレッド 1 プロモーション オファーを取得しようとしています!
- スレッド 4 プロモーション オファーを取得しようとしています!
- メインスレッドが完了しました
- スレッド 3 プロモーション オファーを取得しようとしています!
- スレッド 2 プロモーション オファーを取得しようとしています!
- スレッド 5 プロモーション オファーを取得しようとしています!
- トップ 3 のバリアに到達しました。彼らはプロモーション オファーを受け取ります!
- スレッド 2 はプロモーションオファーを受け取りました!
- スレッド 1 がプロモーションのオファーを受け取りました!
- スレッド 5 はプロモーションオファーを受け取りました!
- タイムアウト例外のため、スレッド 3 はプロモーション オファーを取得できませんでした
- バリア例外のため、スレッド 4 はプロモーション オファーを取得できませんでした