Java Executor Frameworkでマルチスレッド

以前,Javaでマルチスレッドという記事を書きました.

当時はGUIとバックグラウンドを別スレッド処理するという目的だったので,

Threadクラスで別処理の内容を1スレッドずつコツコツ書いていました.

今度は多数のスレッドを作成してマルチコアで並行して同様の処理を行なうコードを書きたかったので,

Executor Frameworkを使ってみました.

Javaでマルチスレッド処理を行うフレームワークには様々なものがある様なのですが,

今回は再帰処理をするわけでもなく,同期処理をする必要もないので,

シンプルなExecutor Frameworkを選択しました.

参考:

さあ、並列プログラミングをはじめよう

Executorフレームワークの使い方

使い方としては,参考記事にもありますが,Runnableクラスのインスタンス

もしくはRunnableクラスをimplementしたクラスを用意して,

ExecutorService.executeに突っ込む,という方法です.

ExecutorServiceの生成時にスレッド数を指定してやれば,

executeするたびに1つのスレッドに処理を割り当ててくれます.

はみ出た処理は待機され,処理が終わって空いたスレッドに

順次未実施の処理が割当たります.

下では,スレッド数を8としてExecutorで処理を行うサンプルです.

10の処理をexecuteする(hoge.length=10)場合,下に示すように順次実行される様子が見れます.

[実行結果]

pool-1-thread-1開始

pool-1-thread-3開始

pool-1-thread-2開始

pool-1-thread-4開始

pool-1-thread-8開始

pool-1-thread-7開始

pool-1-thread-5開始

pool-1-thread-6開始

pool-1-thread-8終了

pool-1-thread-8開始

pool-1-thread-3終了

pool-1-thread-3開始

pool-1-thread-5終了

pool-1-thread-1終了

pool-1-thread-2終了

pool-1-thread-6終了

pool-1-thread-4終了

pool-1-thread-3終了

pool-1-thread-7終了

pool-1-thread-8終了

上記のサンプルではRunnableをimplementするクラスを作成しましたが,

簡単に記述できる処理や値を渡す必要が無い場合,

Runnableクラスのインスタンスを生成するだけでもOKです.

Runnable command = new Runnable() {

  public void run() {

    String threadName = Thread.currentThread().getName();

    System.out.println(threadName+"開始");

    evaluate();

    System.out.println(threadName+"終了");

  }

};