@ITの スレッドの戻り値の取り方についてより。
スレッドでの処理は何かと面倒が多いのですが、結果を返すというのもかなり面倒な処理です。スレッドを扱う上で難しいのは、複数スレッドから操作されるデータの扱い、つまり同期の問題と、複数スレッドの協調動作の扱いです。
データの同期も、スレッドの協調動作も、同じsynchronized キーワードを利用するのですが、だからこそ逆に使い分けが混乱しがちなのではないでしょうか。
このあたりは詳しく掘り下げると分量が多くなるので、とりあえずスレッドからの結果取得のサンプルです。
public class ThreadTest extends Thread {
/** 同期用オブジェクト */
private Object lock = new Object();
/** 処理完了フラグ */
private boolean flag;
/** return用の値 */
private int value;
/** Threadでの処理 */
@Override
public void run() {
// 実処理
// ...
synchronized(this.lock) {
// 終了フラグを立てる
this.flag = true;
// return値を設定
this.value = 0;
// wait()しているスレッドを起こす
this.lock.notifyAll();
}
}
/**
* 値取得用のメソッド。
* Threadの終了まで処理をブロックする
* @return Threadで処理して得た値
* @throws InterruptedException ブロック中に割り込まれた場合
*/
public int getValue() throws InterruptedException {
synchronized(this.lock) {
// 終了前ならwait
while (!this.flag) {
this.lock.wait();
}
// 値を返す
return this.value;
}
}
public static void main(String[] args) throws Exception {
ThreadTest t = new ThreadTest();
t.start();
int ret = t.getValue();
}
}
このサンプルでは結果の取得しようとするスレッドをブロックします。結果が出るまで待ってね、という挙動です。
これは、場合によっては都合がよいのですが、止められると困るケースもあります。スレッドから結果を得る、といった場合にブロックしてよいのか、駄目なのか、このあたりの要件でプログラムの書き方は大きく変わります。
次回以降は並列処理の書き方および、並列処理の設計について掘り下げていきたいと思います。
投稿日時 : 2007年8月21日 15:07