CompletableFuture同時プログラミング能力の向上
4542 ワード
思考:もし2つの順序で実行するのに時間がかかる方法があれば、あなたはどうすればいいですか??
例:
public void doHousework() {
//
doWater();
//
doFloor();
}
そう、私のように頭がいいあなたはすでに考えているに違いありません.2つのスレッドを利用して簡単にこの問題を解決することができます.そこであなたと私はこのようにします:
new Thread(()->doWater()) .start();
new Thread(()->doFloor()) .start();
はい、この問題を解決して、効率を高めました.
ここを見ると、非同期プログラミングがここ数年なぜ火事になったのか理解できると思います.性能の最適化はインターネット大手工場の核心的な需要だからです.Javaは1.8バージョンでCompletableFutureを提供し、非同期プログラミングをサポートしています.CompletableFutureは担当するツールクラスです.
CompletionStageインタフェースの理解方法
ワークフローを分業の観点から類比できると思います.タスクには、シリアル関係、パラレル関係、集約関係など、タイミング関係があります.このように言うと抽象的であるかもしれないが、ここでは、水洗ポットと湯沸かしが直列関係である、水洗ポット、湯沸かしと湯沸かしポット、湯沸かしカップの2つのタスクの間が並列関係である、湯沸かし、茶葉と茶沸かしが集約するCompletionStageインタフェースは、前述のf 3=f 1のようなタスク間のタイミング関係を明確に記述することができる.thenCombine(f 2,()->{})は集約関係を記述する.お茶を沸かすプログラムの集約関係はAND重合関係であり、ここでANDはすべての依存するタスク(お湯を沸かすこととお茶を持つこと)が完了してから現在のタスク(お茶を入れること)を実行することを指す.AND集約関係がある以上、OR集約関係があるに違いない.ORとは、依存するタスクが1つ完成すれば現在のタスクを実行できることを指す.プログラミングの分野では、異常処理という迂回できない山があり、CompletionStageインタフェースでも異常処理を簡単に記述することができます.次に、CompletionStageインタフェースがシリアル関係、AND集約関係をどのように記述するかについて説明します.
1.シリアル関係の説明
CompletionStageインタフェースにはシリアル関係が記述されており、主にthenApply、thenAccept、thenRun、thenComposeの4シリーズのインタフェースである.thenApply系列関数におけるパラメータfnのタイプはインタフェースFunctionであり,このインタフェースにおけるCompletionStageに関するメソッドはR apply(T t)であり,このメソッドはパラメータを受信しても戻り値をサポートするのでthenApply系列メソッドはCompletionStageを返す.一方thenAcceptシリーズメソッドにおけるパラメータconsumerのタイプはインタフェースConsumerであり,このインタフェースにおけるCompletionStageに関するメソッドはvoid accept(T t)であり,このメソッドはパラメータをサポートするが戻り値をサポートしないためthenAcceptシリーズメソッドはCompletionStageを返す.
thenRunシリーズメソッドではactionのパラメータはRunnableなので、actionはパラメータも戻り値もサポートしないのでthenRunシリーズメソッドでもCompletionStageを返します.これらの方法の中でAsyncは非同期実行fn,consumerまたはactionを表す.その中で、thenComposeシリーズの方法に注意してください.このシリーズの方法は新しいサブプロセスを作成し、最終的な結果はthenApplyシリーズと同じです.
CompletionStage thenApply(fn);
CompletionStage thenApplyAsync(fn);
CompletionStage thenAccept(consumer);
CompletionStage thenAcceptAsync(consumer);
CompletionStage thenRun(action);
CompletionStage thenRunAsync(action);
CompletionStage thenCompose(fn);
CompletionStage thenComposeAsync(fn);
次のサンプルコードでは、thenApply()メソッドがどのように使用されているかを見ることができます.まずsupplyAsync()を介して非同期プロセスを開始し,その後は2つのシリアル操作であり,全体的には簡単に見える.ただし,これは非同期フローであるが,タスク①②③はシリアル実行であり,②は①の実行結果,③は②の実行結果に依存する.
CompletableFuture f0 =
CompletableFuture.supplyAsync(
() -> "Hello World") //①
.thenApply(s -> s + " QQ") //②
.thenApply(String::toUpperCase);//③
System.out.println(f0.join());
//
HELLO WORLD QQ
2.AND集約関係の記述
CompletionStageインタフェースにはAND集約関係が記述されており、主にthenCombine、thenAcceptBoth、runAfterBothシリーズのインタフェースであり、これらのインタフェースの違いもfn、consumer、actionの3つのコアパラメータの違いに由来している.これらの使用は、上記のお湯を沸かしてお茶を入れる実装プログラムを参考にすることができます.ここでは説明しません.
CompletionStage thenCombine(other, fn);
CompletionStage thenCombineAsync(other, fn);
CompletionStage thenAcceptBoth(other, consumer);
CompletionStage thenAcceptBothAsync(other, consumer);
CompletionStage runAfterBoth(other, action);
CompletionStage runAfterBothAsync(other, action);