2

以前の投稿では、オブザーバーパターンを使用しました。説明 -

クラスFlightにはステータス(つまりint)があります-時間前、時間通り、遅れ。これは私のObservableクラスですFlightStatusMonitorにはFlightsのArrayListがあります。このクラスは私のオブザーバーです。そのようなオブザーバーは1人だけです。update(Observable o、Object arg)メソッドは、フライトのステータスを更新し、監視しているすべてのフライトの更新されたフライトステータスも表示します。

タイマータスクを使用して、選択した時間にフライトのステータスを変更し、すべてのフライトの更新されたステータスを確認することを考えていました。

タイマータスクで変更した直後の画面に表示されるフライト状況を確認したい。

しかし、これを正しく行っているかどうかはわかりません。ここで並行性が問題になりますか?

更新 ステータスをバッチで変更する一連のフライトがあります。バッチサイズは1フライト以上にすることができます-1、5、15、22、45など。ただし、すべてのフライトを指定することはできません。あるバッチのステータスを変更し、数秒後に別のバッチのステータスを変更するなど。一部のフライトは変更されません。

関連記事

4

2 に答える 2

1

Observerが可変状態変数を使用しない限り、同時実行の問題は発生しません。それでも、タスクをスケジュールする場合にのみ問題になります。つまり、前のタスクが終了する前に1つのタスクを開始します。タスクが順番に開始される場合、問題はありません。

于 2013-03-27T11:16:07.457 に答える
0

シナリオ:タイマーイベントについて複数のオブザーバーに通知します。

アプローチ :

  • タイマーとタイマータスクを作成するウォッチドッグクラスを作成します。
  • オブザーバーはウォッチドッグイベントに登録します。
  • タイマーイベントのウォッチドッグクラスは、オブザーバーに通知します。

以下のサンプルコードは、タイマータスクとオブザーバーを組み合わせるシナリオを示しています。

// WatchDog.java

import java.util.Observable;
import java.util.Observer;
import java.util.Timer;
import java.util.TimerTask;

// Observer class

class Observer1 implements Observer{

@Override
public void update(Observable arg0, Object arg1) {
System.out.println("Observer1 notified");
}
}

// Watchdog Component which creates the timer and notifies the timers.

public class WatchDog extends Observable {
    Timer timer;
    int seconds;

   // Notify task to notify observers

    class NotifyTask extends TimerTask{

        @Override
        public void run() {
        setChanged();
        notifyObservers();
        }
    }

    public WatchDog( ) {
        timer = new Timer(); 
    }

    public void schedule(long seconds){
        timer.scheduleAtFixedRate(new NotifyTask(), 0, seconds*1000); //delay in milliseconds

    }

    public void stop(){
    timer.cancel();
    }

    public static void main(String args[]) throws InterruptedException {
        Observer1 observer1 = new Observer1();

        WatchDog watchDog = new WatchDog();
        // register with observer
        watchDog.addObserver(observer1);

        System.out.println("WatchDog is scheduled.");
        watchDog.schedule(5);
        Thread.sleep(25000);

        watchDog.stop();
    }
}

詳細については、記事「Javaタイマーとオブザーバー」を参照してください。

于 2015-06-12T13:01:51.827 に答える