2

コード スニペットは次のとおりです。

Timer t = new Timer();
TimerTask task = new TimerTask() {
    int i = 0;
    int longTimeJobPoint = 2;
    @Override
    public void run() {
        System.out.println(new Date());
        if(++i == longTimeJobPoint)    {
            try {
                System.out.println("sleeping time...");
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

};

//every 10 sec
t.scheduleAtFixedRate(task, new Date(), 10000);

結果は次のとおりです。

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013  //piled task
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

ご覧のとおりThread.sleep()、30 秒間遅延すると、スケジュールされたタイマーは 10 秒ごとに呼び出されるタスクを積み上げます。私が望むのは、最後のタスクがまだ終わっていないために遅れているタスクをスキップすることです。出力は次のようになります。

Sat Oct 19 10:44:59 CST 2013
Sat Oct 19 10:45:09 CST 2013
sleeping time...
Sat Oct 19 10:45:39 CST 2013
Sat Oct 19 10:45:49 CST 2013

誰か助けてくれませんか?どうもありがとう!

4

1 に答える 1

1

代わりに固定遅延実行を使用する必要があります。これは、前のタスクの開始時間ではなく完了時間に基づいて次のタスクを開始します。Timer必要なものがサポートされていない場合は、 Quartzなどのより機能的なスケジューリング ライブラリを調べてください。

于 2013-10-19T03:29:57.073 に答える