以前,Javaでマルチスレッドという記事を書きました.
当時はGUIとバックグラウンドを別スレッド処理するという目的だったので,
Threadクラスで別処理の内容を1スレッドずつコツコツ書いていました.
今度は多数のスレッドを作成してマルチコアで並行して同様の処理を行なうコードを書きたかったので,
Executor Frameworkを使ってみました.
Javaでマルチスレッド処理を行うフレームワークには様々なものがある様なのですが,
今回は再帰処理をするわけでもなく,同期処理をする必要もないので,
シンプルなExecutor Frameworkを選択しました.
参考:
使い方としては,参考記事にもありますが,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+"終了");
}
};