CompletableFutureクイックスタート
10630 ワード
参考内容:join()、get()の違いJava 8新しい非同期プログラミング方式CompletableFuture
サンプル展示
他の非同期実行をCompletebleFutureに変換
ここでは新規スレッドの実行状況をCompletebleFutureで制御し,その実行が完了したかどうかなどを随時把握する.
CompletebleFutureをアクティブに構築
いずれかが完成すればよい
ここで
書き方①
書き方②
PS:
thenCombineAsyncとthenComposeAsync
ここで
サンプル展示
他の非同期実行をCompletebleFutureに変換
ここでは新規スレッドの実行状況をCompletebleFutureで制御し,その実行が完了したかどうかなどを随時把握する.
CompletableFuture completableFuture = new CompletableFuture();
AtomicReference startTs = new AtomicReference();
new Thread(() -> {
try {
startTs.set(System.currentTimeMillis());
Thread.sleep(2000L);
completableFuture.complete(" ");// completableFuture
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
while (!completableFuture.isDone()) {// completableFuture
System.out.println(completableFuture.getNow(" "));// , " "( : " ")
}
System.out.println((System.currentTimeMillis() - startTs.get()) + " ms");
System.out.println(completableFuture.getNow(" "));
CompletebleFutureをアクティブに構築
exceptionally()
は異常捕獲の方法であり、後続の例は重複しないが、いずれもこの例と同じである. CompletableFuture completableFuture = CompletableFuture.completedFuture(" ").thenApplyAsync(x -> {
System.out.println(" : " + x);
System.out.println(1 / 0);
return " , ";
}).thenApplyAsync((y) -> {
System.out.println(" : " + y);
return " , ";
}).exceptionally((Throwable ex) -> {// ex s ,s , :“ , !”“ ~ , ~”
System.out.println(ex.getMessage());
return " ";
});
try {
Thread.sleep(100L);// 100 ,
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(completableFuture.getNow(" "));
System.in.read();
いずれかが完成すればよい
ここで
completableFuture5.get();
の結果は、completableFuture1
、completableFuture2
、completableFuture3
のうち最も早く完了した戻り値である書き方①
CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000L);
System.out.println("completableFuture1");
return "1";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(500L);
System.out.println("completableFuture2");
return "2";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture3 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(100L);
System.out.println("completableFuture3");
return "3";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture4 = completableFuture1.applyToEither(completableFuture2, (x) -> {
System.out.println("1、2 ");
return x;
});
CompletableFuture completableFuture5 = completableFuture4.applyToEither(completableFuture3, (x) -> {
System.out.println("1、2、3 ");
return x;
});
System.out.println("completableFuture5 :" + completableFuture5.join());
System.in.read();
書き方②
CompletableFuture.anyOf()
の使用
CompletableFuture[] array = new CompletableFuture[3];
array[0] = completableFuture1;
array[1] = completableFuture2;
array[2] = completableFuture3;
CompletableFuture fastestOne= CompletableFuture.anyOf(array);// anyOf , CompletableFuture , CompletableFuture
System.out.println("fastestOne :" + fastestOne.join());
PS:
CompletableFuture.allOf(array)
allOfは、arrayにブロックされたすべてのCompletableFutureが完了しましたthenCombineAsyncとthenComposeAsync
completableFuture4
に含まれる方法の消費時間はそれぞれ500 ms、1000 msである.completableFuture5
に含まれる方法の消費時間はそれぞれ600 ms、600 msである.ここで
completableFuture4
、completableFuture5
は非同期で実行され、ほぼ同時に開始され、completableFuture4
の内部メソッドは非同期であり、completableFuture5
の内部メソッドは同期であるため、先に出力されたthenCombineAsync
はthenComposeAsync
ではなく値を返す. CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(500L);
System.out.println("completableFuture1");
return "1";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000L);
System.out.println("completableFuture2");
return "2";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture3 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(600L);
System.out.println("completableFuture3");
return "3";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
});
CompletableFuture completableFuture4 = completableFuture1.thenCombineAsync(completableFuture2, (x, y) -> {
return x.toString() + y.toString();
});
CompletableFuture completableFuture5 = completableFuture3.thenComposeAsync((x) -> CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(600L);
return x + "5";
} catch (InterruptedException e) {
e.printStackTrace();
return " ";
}
}));
while (!completableFuture5.isDone() || !completableFuture4.isDone()) {
if (completableFuture5.isDone()) {
System.out.println(completableFuture5.join());
}
if (completableFuture4.isDone()) {
System.out.println(completableFuture4.join());
}
}
System.out.println(completableFuture5.getNow(" "));