有没有办法跟踪完全期货中的失败状态?
我有一个场景,我有三个期货,其中put()可以成功或抛出RunTime异常;我只希望两个人成功。换句话说,如果第一次和第二次放置成功,我想取消第三次并且不希望未来完成。但是,如果第一个失败,我想继续其他两个。
如何跟踪CompletableFuture中的异常,如何根据成功次数取消一组期货中的未来?
final CompletableFuture<Try<Void>> a = CompletableFuture.supplyAsync(() -> put());
final CompletableFuture<Try<Void>> b = CompletableFuture.supplyAsync(() -> put());
final CompletableFuture<Try<Void>> c = CompletableFuture.supplyAsync(() -> put());
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(a,b,c);
combinedFuture.get();
答案 0 :(得分:0)
我认为Phaser在这里很有用:
Phaser phaser = new Phaser(2);
final CompletableFuture<Void> a =
CompletableFuture.supplyAsync(() -> { put(); phaser.arrive(); return null; });
final CompletableFuture<Void> b =
CompletableFuture.supplyAsync(() -> { put(); phaser.arrive(); return null; });
final CompletableFuture<Void> c =
CompletableFuture.supplyAsync(() -> { put(); phaser.arrive(); return null; });
CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(a,b,c);
phaser.awaitAdvanceInterruptibly(0);
new Phaser(2)
表示Phaser将在标记为“已终止”之前等待两次arrive()
次呼叫,这将导致任何等待提升的方法返回。