←フエルチラシノウラ。トップページへもどる。

【Java】waitとnotifyを利用したコールバックの実現【イベント】

Java wait notifyAll スレッド Thread callback event イベント リスナ 非同期

ShareObjectというデータクラスのメンバ変数「data」が更新されたら、
その更新をスレッドが検知してなんらかの結果を出力するサンプルです。

監視対象のデータクラス

/**
* 共有されるデータクラス。
* メンバのdataが変更されたらreadメソッドのwaitが解除されて最新のdataを返します。
*/
public class SharedObject {
private String data;

public synchronized String read() {
try {
// writeメソッド内でnotifyが呼ばれるまで待機します。
wait();
} catch (InterruptedException e) {
System.out.println(e);
}
// メンバdataを返します。
return data;
}

public synchronized void write(String str) {
// メンバdataを変更します。
data = str;
// readメソッドのwaitを解除します。
notifyAll();
}
}


テスト用クライアント

/**
* SharedObjectテスト用クライアント
* 5秒に一回SharedObject.writeを実行して値を書き換えます。
* 書き換えが行われたタイミングでSharedObjectを監視していたWatchingThreadが
* 変化を検知して画面へメッセージを出力します。
*/
public class Client {

/** 監視対象のオブジェクト */
private SharedObject sharedObject = null;

public static void main(String[] args) {
new Client();
}

public Client() {
sharedObject = new SharedObject();

// 監視スレッドを起動しておきます。
WatchingThread t = new WatchingThread();
t.start();

while (true) {
// 5秒に一回sharedObjectのdataに時間を書き込みます。
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
sharedObject.write("" + System.currentTimeMillis());
}
}

/**
* SharedObjectを監視するスレッド
*/
class WatchingThread extends Thread {
@Override
public void run() {
while (true) {
// sharedObjectのdataが変更されるまでここで待機します。
String changedData = sharedObject.read();
System.out.println("sharedObject.data が変更されました。" + changedData);
}
}
}

}


実行結果

sharedObject.data が変更されました。1176374770615
sharedObject.data が変更されました。1176374775613
sharedObject.data が変更されました。1176374780611

http://goodjob.boy.jp/chirashinoura/id/132.html

作成日: 2007-04-12 19:50:19

最終更新日: 2007-04-18 22:33:18

▲このページの上へ