【问题标题】:Keeping track of success of Completable Futures跟踪 Completable Futures 的成功
【发布时间】:2017-11-20 22:09:31
【问题描述】:

有没有办法跟踪 Completeable Futures 中的失败状态?

我有一个场景,我有三个未来,其中 put() 可以成功或抛出运行时异常;我只希望两个成功。换句话说,如果第一个和第二个 put 成功,我想取消第三个并且不希望那个未来完成。但是,如果第一个失败了,我想继续其他两个。

如何跟踪 CompletableFuture 中的异常以及如何根据成功次数取消一组 Futures 中的一个 Future?

 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) 回调或 2) 投票
  • 你能再描述一下吗?
  • 对不起,我不是Java这个角落的专业人士,所以我会为那些专业的人留下详细的答案。

标签: java future java.util.concurrent


【解决方案1】:

我认为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() 调用,然后将自己标记为“已终止”,这将导致任何等待推进的方法返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2016-02-16
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多