2012年12月17日月曜日

ThreadPool

 Java5以降、ExecutorServiceを用いることでスレッドプールをサクッと作ることができるようになりました。例えば、最大同時実行数が10となるようなスレッドプールの場合、

ExecutorService threadPool =

Executors.newFixedThreadPool(10);

でスレッドプールを準備し、あとはthreadPool.execute(Thread)って感じで並行処理させたいスレッドをぽいぽい投げ込めばOK。
 Java1.4の時に自前でスレッドプール(のようなもの)を実装したことがあるのですが、それを思うとすごく簡単ですね。
 で、並行処理とよく組み合わせることになりそう(僕だけ?)なのが、「全てのスレッドの処理が終わるまで待機」ってやつでしょうか。これも、Java5なら

threadPool.shutdown();

threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

でできあがり。shutdown()を忘れると、awaitTermination以降が進まなくなります。最初それに気付かず、「終わらない」プログラムを作ってしまいました。
 ちなみに、JavaDoc(日本語版)には、
シャットダウン要求後にすべてのタスクが実行を完了する、タイムアウトが発生する、現在のスレッドで割り込みが発生する、のどれかが最初に起きるまでブロックします。
と記載されています。最初に気付きましょうね。
#awaitTerminationでLong.MAX_VALUEをセットしているのは、タイムアウトを実質無効としたいためです。

0 件のコメント:

コメントを投稿