0

現在、ScheduledExecutorService が指定された時間枠よりも速く実行されるという問題が発生しています。

scheduleAtFixedRateは、後続の実行が遅れる可能性があることを示していますが、後で指定された時間は待機しません。

GrabPutTask は、ソースから情報を取得し、キャプチャ時間を割り当て、それをデータベースに送信するだけです。間隔が 1 秒未満になるため、データベース エントリは重複エントリに関してエラーを返します。

前のタスクが完了した後、一定の時間にタスクを実行する方法はありますか?

ここで、タスクがキューに「まとまる」ことを読みましたが、私のニーズに対する解決策は提示されませんでした。

private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

public static void main(String[] args)
{
    //
    ..
    //
    //Creating the looping thread.
    try
    {
        scheduler.scheduleAtFixedRate(new GrabPutTask(), (long) 1, (long) (seconds * 1000), TimeUnit.MILLISECONDS);
        LOGGER.info(String.format("DBUpdater connected and running. (GetAddr: %s, SetAddr: %s, Poll Rate: %.2f, Sector Number: %s, Number of PLCs: %d)",
                                  FROM_IP.split(":", 2)[0] + ":" + fromServer.getPort(), dataSource.getURL(), seconds, SECTOR, NUMBER_OF_PLCS_ON_MASTER));
    }
    catch (IllegalArgumentException ex)
    {
        LOGGER.log(Level.SEVERE, null, ex);
        printUsage();
        System.exit(1);
    }
}

実行時間間隔の例:

Event Called: 2014/02/12 14:19:07.199
Event Called: 2014/02/12 14:19:08.199
Event Called: 2014/02/12 14:19:09.199
Event Called: 2014/02/12 14:19:10.199
Event Called: 2014/02/12 14:19:11.199
Event Called: 2014/02/12 14:19:12.199
Event Called: 2014/02/12 14:19:13.199
Event Called: 2014/02/12 14:19:14.199
Event Called: 2014/02/12 14:19:15.199
Event Called: 2014/02/12 14:19:16.199
Event Called: 2014/02/12 14:19:17.199
Event Called: 2014/02/12 14:19:18.199
...
Event Called: 2014/02/12 14:20:21.415 (A load on the server it seems)
Event Called: 2014/02/12 14:20:22.215
Event Called: 2014/02/12 14:20:23.425
Event Called: 2014/02/12 14:20:24.422
Event Called: 2014/02/12 14:20:25.276
Event Called: 2014/02/12 14:20:25.997
4

2 に答える 2

3

scheduleWithFixedRateなんらかの理由で実行が遅れた場合、「追いつく」ことを試みます。を使用scheduleWithFixedDelayして、前回の実行後までシステムがクロックを開始しないようにすることができます。遅れが積み重なって追いつかなくなる。

于 2014-02-12T23:09:25.953 に答える