for(Date timerDate1=startDate; timerDate1<=cal3.add(cal3.DATE,7);startDate=cal3.add(cal3.DATE,1))
{
long period=60*60*1000;
Timer timer = new Timer();
timer.schedule(new MyTask(),timerDate,period);
cal3.add(cal3.DATE,1);
}
2 に答える
forループの代わりに、単一のタイマーを使用scheduleAtFixedRate
し、期間が。のタイマーのメソッドの1つにタスクを渡しますTimeUnit.DAYS.toMillis(1)
。
タスククラスは開始日を使用して作成する必要があり、クラスはその日付をフィールドに格納する必要があります。クラスのrun
メソッドで、カレンダーを使用して、現在の時刻から7日を引いた時刻がタスクの開始日よりも遅いかどうかを確認し、遅れている場合は、すぐに呼び出しcancel()
て戻ります。
timer.scheduleAtFixedRate を使用する
void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)
scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task,
long delay,
long period)
指定されたタスクを、指定された遅延の後に開始して、固定レートで繰り返し実行するようにスケジュールします。後続の実行は、指定された期間で区切られたほぼ一定の間隔で行われます。固定レートの実行では、各実行は、最初の実行のスケジュールされた実行時間に対して相対的にスケジュールされます。なんらかの理由 (ガベージ コレクションやその他のバックグラウンド アクティビティなど) で実行が遅延した場合、「追いつく」ために 2 つ以上の実行が立て続けに発生します。長期的には、実行頻度は指定された期間の逆数になります (Object.wait(long) の基礎となるシステム クロックが正確であると仮定します)。
固定レートの実行は、毎正時にチャイムを鳴らしたり、毎日特定の時刻にスケジュールされたメンテナンスを実行したりするなど、絶対時間に敏感な繰り返しアクティビティに適しています。また、毎秒 1 回 10 秒間作動するカウントダウン タイマーなど、一定回数の実行を実行するための合計時間が重要な繰り返しアクティビティにも適しています。最後に、固定レート実行は、相互に同期を維持する必要がある複数の繰り返しタイマー タスクをスケジュールする場合に適しています。
パラメータ: task - スケジュールされるタスク。delay - タスクが実行されるまでのミリ秒単位の遅延。period - 連続するタスク実行間のミリ秒単位の時間。例外: IllegalArgumentException - delay が負の場合、または delay + System.currentTimeMillis() が負の場合。IllegalStateException - タスクがすでにスケジュールされているかキャンセルされている場合、タイマーがキャンセルされた場合、またはタイマー スレッドが終了した場合。