2017-11-24 6 views
0

私は非同期で2つのタスクを実行するためにCompletetable futureを使用しようとしています。プログラムは非同期的に実行され、a()とb()が最初に任意の順序で同時に実行されます。しかし、C()のみ()の1またはb(どちらか後に実行することができます)私はCompletableFutureのAPIに精通していないよいずれかの非同期メソッドが実行された後にJavaでメソッドを実行していますか?

class Pair{ 
    public void pair2() throws InterruptedException, ExecutionException { 
    CompletableFuture<Void> fa = CompletableFuture.runAsync(() -> a()); 
    CompletableFuture<Void> fb = CompletableFuture.runAsync(() -> b()); 

    if(fa.isDone || fb.isDone){ //should not be if loop. 
     c(); 
    } 
    return; 
    } 

    public void a(){ 
    System.out.println("I'm a."); 
    return; 
    } 
    public void b(){ 
    System.out.println("I'm b."); 
    return; 
    } 

    public void c(){ 
    System.out.println("I'm c, I cannot be the first!"); 
    return; 
    } 
} 

を完了は、タスクのいずれかが行われているかどうかを確認する方法がありますし、次のメソッドCを呼び出しますか?

+0

い '場合(fa.isDone())'の仕事を? – Colonder

+0

残念ながら、 – Carrein

答えて

2

xxxEitherのいずれかの方法を使用できます。たとえば、次のように

CompletableFuture<Void> fc = fa.acceptEither(fb, v -> c()); 

それとも、anyOfメソッドを使用できます。

CompletableFuture.anyOf(fa, fb).thenRun(this::c); 
+0

これは機能します! isDoneがしない理由は何ですか? isDoneを使うのが間違っていたら? – Carrein

+1

@Carrein 'isDone'はすぐに戻ります。つまり、あなたの例では、タスクがまだ終了しておらず、falseを返す可能性が高いです。 – assylias

関連する問題