3

データの更新を受け取るクラス(以下に表示)があります。私の目的は、最後のデータ更新から5分後にデータ更新が受信されていないかどうかを確認することです。

これは私のコードです:

public class DataListener {

    private final ScheduledThreadPoolExecutor executor;
    private ScheduledFuture<Void> future;

    public DataUpdateListener() {
        executor = new ScheduledThreadPoolExecutor(1);
    }

    /**
     * Start listening for data.
     */
    public void start() {
        // do some setup...

        rescheduleTask();
    }

    /**
     * Called whenever a data event is received.
     */
    public void onEvent(final DataEvent event) {
        System.out.println("Received event: " + event);
        rescheduleTask();
    }

    private synchronized void rescheduleTask() {
        // cancel the existing task
        if (future != null) {
            future.cancel(true);
            executor.purge();
        }

        // schedule a new one
        future = executor.schedule(new Callable<Void>() {
            @Override
            public Void call() {
                System.out.println("No data events received in the last 5 minutes!");
                // do some stuff...
                shutdown();
                return null;
            }
        }, 5, TimeUnit.MINUTES);
    }

    void shutdown() {
        executor.shutdownNow();
    }    
}

クラスはを維持しScheduledThreadPoolExecutorます。データの更新を受信するたびに、既存のタスクがキャンセルされ、新しいタスクがスケジュールされます。

このアプローチが大丈夫なのか、それともこれを行うためのより良い方法があるのか​​疑問に思います。

4

2 に答える 2

1

優先キューの実装を検討しましたか?私があなたの問題を誤解していなければPriorityBlockingQueue、この場合はaのようなものが役立つでしょう。poll()特に、必要なタイムアウト値を使用してメソッドをチェックできます。

于 2012-10-08T11:04:00.923 に答える
0

このメソッドでは、スケジュールされたタスクを明示的に指定cancelし、新しいタスクをスケジュールします。これは再スケジュールではありません..これは実際にスケジュールを作成しています。IMO、「間もなく」のスケジュールをリストに保存することをお勧めしqueueますstack。次に、準備ができたらタスクを取得します。

于 2012-10-08T10:43:09.597 に答える