1

Observerパターンでシンプルなタイマーを実装しました。メイン関数実行中に5分経過したら終了させたいと思っていました。基本的に必要なのは、単純なワンショット タイムアウト機能です。どうすればこれを達成できますか?コードが機能しません。以下はタイマークラスです

public class OneShotTimer  extends Observable implements Runnable{

@Override
public void run() {
    // TODO Auto-generated method stub
    try {
        Thread.sleep(30);
    } catch (Exception e) {
        // TODO: handle exception
        System.out.println("Exception in timer");
    }
    notifyObservers();
}

メイン クラスのコンストラクターで、そのタイマーを初期化します。

public GreenOverlayMain(){
    timer = new OneShotTimer();
    timer.addObserver(this);
    Thread t = new Thread(timer, "mythread");
    t.start();
}

ただし、タイムアウトが発生しないため、メイン クラスの update() 関数は実行されません。MainClass は Observer インターフェイスを実装します。以下は更新機能です。

@Override
public void update(Observable o, Object arg) {
    // TODO Auto-generated method stub
    System.gc();
    System.exit(0);
}
4

2 に答える 2

3

この例では、印刷update終了の実行を終了します。

public static void main(String[] args){
    //scheduler executor is a lot more sophisticated solution
    final ScheduledExecutorService sheduler = Executors.newScheduledThreadPool(1);
    class MyO extends Observable {
        public void trackChanged(){
            setChanged(); //this method is protected in super class
        }
    };
    //must be final because it used in nested class
    final MyO o = new MyO();
    o.addObserver(new Observer() {
        @Override
        public void update(Observable o, Object arg) {
            //your processing here
            System.out.println("update");
            sheduler.shutdown();
        }
    });
    sheduler.schedule(new Runnable() {
        @Override
        public void run() {
            o.trackChanged();
            o.notifyObservers();
        }
    }, 3, TimeUnit.SECONDS); //set any timout
}
于 2013-09-20T10:55:14.053 に答える