import java.util.*; public class DataReader implements Runnable { volatile protected Thread myThread; protected long timeBase = 1000; // mSec protected boolean active = false; // 一時停止用のフラグ protected int value = 0; // 監視対象機器から取得した値を保持 private Vector dataListeners = new Vector(); // リスナオブジェクト群を保持 // コンストラクタ public DataReader() { super(); myThread = new Thread(this); myThread.start(); } // リスナ登録メソッド public synchronized void addDataChangeListener(DataChangeListener vl) { dataListeners.addElement(vl); } // 監視対象機器から値を取得する protected int getMonitoredValue() { //とりあえず、ランダムに値を生成して返す。 return (int) (Math.random() * 100); } public long getTimeBase() { return timeBase; } public int getValue() { return value; } public boolean isActive() { return active; } // 機器から値を取得してvalueに設定する。そしてイベントを発信する。 public void readAndSetValue() { int newVal = getMonitoredValue(); if (value == newVal) return; value = newVal; DataChangeEvent e = new DataChangeEvent(this, value); // イベントの生成 Vector cloneVec ; synchronized (this) { cloneVec = (Vector)dataListeners.clone(); } // リスナ登録されていた各オブジェクトのイベント処理メソッドを起動する。 for (int i=0; i 0) { timeBase = millis; } } // スレッド実行を終了させるためのメソッド protected synchronized void stop() { Thread th = myThread; myThread = null; th.interrupt(); } }