跟踪可完成期货的成功

时间:2017-11-20 22:09:32

标签: java future java.util.concurrent

有没有办法跟踪完全期货中的失败状态?

我有一个场景,我有三个期货,其中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();

1 个答案:

答案 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()次呼叫,这将导致任何等待提升的方法返回。