- 2009年5月 8日 20:02
- Java
講座でとりあげているJ2SE 5.0の主な追加機能は、
- Generics
- 拡張for文
- Auto-Boxing Un-Boxing
- Enum
などですが、今回は並行プログラミング用ライブラリである
Executorを紹介していきます。
Executorは複数のタスク(並行実行の単位)を並行して実行する際に利用する
フレームワークとして追加されたインターフェースです。
java.util.concurrentパッケージにはExecutorの他、このインターフェースを
継承したインターフェースと及び実装したクラスが含まれています。
これらの追加機能によりThreadをより柔軟に扱うことができます。
まずは従来通りのThreadの生成の仕方を確認しましょう。
Threadを生成するには2通りの方法がありました。
- Threadクラスを継承したクラスでrunメソッドをオーバーライドしその
クラスをインスタンス化する - Runnableインターフェースを実装したクラスでrunメソッドをオーバーライド
し、Threadクラスをインスタンス化する際引数にその参照を渡す
これらの方法は、RunnableインスタンスとThreadインスタンスが1対1の関係、
つまり密な関係になっているためThreadの実装方法に依存したプログラム
の作成が必要であり、それは、スレッドの実行・制御をするプログラムが
複雑になってしまうという問題がありました。
ExecutorはRunnableインスタンスとThreadインスタンスの間に入り、 Runnableイン
スタンスの参照を受け取ってThreadインスタンスにその参照を渡します。
このように間接的にRunnableインスタンスを実行することにより、
Threadインスタンスの実装方法に依存しない柔軟なプログラミングが
可能になってきます。
つまり、RunnableインスタンスがどのThreadインスタンスで実行されるかは
Executorインターフェースの実装しているクラスの内容や
Executorインターフェースインスタンスの生成時の設定に依存しているということです。
以下はExecutorのシンプルなサンプルです。
RunnableObjは8桁の乱数を生成するRunnableインスタンスです。
ExecutorObj
インスタンスがThreadインスタンスに対し executeメソッドでRunnableインスタンス
を渡しています。
class RunnableObj implements Runnable
{
private StringBuffer sbf= null;
public RunnableObj()
{
sbf = new StringBuffer();
}
public void run()
{
for(int i = 0;i<8;i++)
{
int num = (int)(Math.random()*10);
sbf.append(Integer.toString(num));
}
System.out.println(Thread.currentThread().getName()+" : "+sbf+"\n");
}
}
class ExecutorObj implements Executor
{
private int num;
public ExecutorObj(int num)
{
this.num = num;
}
public void execute(Runnable r)
{
Thread th = new Thread(r,"スレッド No."+num);
th.start();
}
}
public class ExeMain
{
public static void main(String args[])
{
int thread_num = 5;
for(int i=0;i {
Runnable rn = new RunnableObj();
Executor ex = new ExecutorObj(i);
ex.execute(rn);
}
System.out.println("End Main");
}
}
ExecutorインターフェースだけではただRunnableインスタンスを渡している
だけなので図1の動作と変わりはありません。
しかし、Executorインターフェースを標準実装しているThreadPoolExecutor
クラスやScheduledThreadPoolExecutorクラスなど、
多数の並行プログラム用の機能があります。
また別な機会にご紹介していきますのでご期待ください。
--------------------------------------------------------------------------------
パソコンスクール KENスクール渋谷校 Programインストラクターhttp://www.kenschool.jp/school/shibuya/index.html
KENスクールでJavaを学びたい方は、Program講座へ!
http://www.kenschool.jp/Program/index.html


