kanizaのブログ

コンピュータ、ソフトウェア、映画、音楽関連や家族のことなど、思いついたことを書きます。

java.util.concurrent

昨日の続きでマルチスレッドプログラミング重要ということでJDK5から入った並行処理ユーティリティパッケージjava.util.concurrentについてちょっと調査。ちょっと見えてきた。

Executors.newSingleThreadExecutor()で生成したExecutorServiceにCallableをsubmitすると、Callableをキューに入れて別スレッドで順番に処理していってくれる。これは使える。キューを処理するスレッドとか自分で作らなくてもいいわけか。Executorsの他のメソッドでは複数のスレッドを使うExecutorServiceとかも生成できる。

Callableは単にV型のオブジェクトを返すというインタフェース。これをExecutorServiceにsubmitすると、別スレッドでcall()が呼ばれることになる。だからsubmit自体はすぐに終わる。submitの戻り値はFutureで、getメソッドとかがある。getするとCallableのcall()の結果が取れるんだけど、これはCallableの処理が終わるまで待たないといけない。submitから戻ってきた時点のFutureは、まだ結果が出ていないかもしれないんだよね。それどころかまだ処理が始まっていないかもしれない。だからFutureという名前なのだな。

Callableは戻り値ありのRunnableという感じだから他の場所でも使えそうだ。戻り値の型を指定できるというのはJDK5のGenericsのおかげですな。だからこれまで無かったのかも。

複数タスクを並列に処理していくというのはその処理手順自体が比較的複雑なわけだけど、Callableとかのインタフェースでタスクを抽象化することで、ExecutorServiceのように処理手順をカプセル化できるというのはオブジェクト指向らしくて面白い。僕はCallableさえちゃんと書けば、並行処理の専門家が作ったExecutorServiceのお世話になれるわけだ。ありがたいことだ。でも並行処理の勉強という意味ではExecutorServiceの中身をよく知らないといけないのだろうな。