自分の無知を恥じて省みるための記事なので有益ではないです。結論から言うと、「デザインパターンそのものは知らなくても、そのパターンが基になって実装された機能がある」という当たり前のことを、頭の片隅においておこうね、という自分向けの記事です。
(今はよっぽどのことがないとJavaでマルチスレッドプログラミングなんてしないですが、)Java 8でマルチスレッド処理というとCompletableFuture
が思い浮かびます。ただ、Futureが機能の名前ではなくてマルチスレッドプログラミングのデザインパターンの名前だというのを、今の今まで知りませんでした。
第二に promise は単なる言語表現だが、future は現物(actuals)に対する先物(futures)という意味もある(つまり、実際の物に対する代用品)。
今は中身が無いけれど未来に結果が取得できるからFutureなんですね。
もっというとFuture自体はJDK5の時点で導入されてたんですね…。ThreadとRunnableしか使えないと思っていたのですが、全然そんなことはなかった。
8. java.util.concurrentパッケージ2 (2) | TECHSCORE(テックスコア)
ExecutorService
にCallable
を送信するとCallableのタスクを別スレッドで開始して、メインスレッドには即Futureのオブジェクトを返すようになっています。パーフェクトJavaにもありますが、Futureをメインスレッドでgetすると結局メインスレッドが停止するので、JDK5しか使えないとかいう環境でない限りCompletableFuture使ったほうがスマートですね。
JavaScriptのPromiseもデザインパターンの名前だったし、なんとなく使ってちゃだめだと反省しました。