JAvaタイミングスケジューリングクラスTimer、TimerTask紹介
7825 ワード
Javaでは、TimerクラスとTimderTaskクラスを使用して、タイミングタスクの実行を完了します.
まず簡単な例を見てみましょう.
例1:
出力内容は、start at:Thu Apr 18 16:25:08 CST 2013 current time is:Thu Apr 18 16:25:13 CST 2013
例1 5秒の遅延後にスケジューリングタスクを実行するのは簡単です.
例2:
出力結果:start at:Thu Apr 18 16:28:18 CST 2013 current time is:Thu Apr 18 16:28:23 CST 2013 current time is:Thu Apr 18 16:28:25 CST 2013 current time is:Thu Apr 18 16:28:27 CST 2013
例2は、5秒の遅延後に2秒ごとにタスクを実行する
上記の2つは、指定した日時から1回、または繰り返し実行されます.
最初に実行された時間fristTimeがまだ将来の時間になっていない場合、プログラムは現在の時間が指定されたfirstTimeになるまでブロックされます.
では、指定された時間が過ぎたら?例3を参照すると、プログラムはすぐに実行を開始するか、時間間隔で複数回実行されます.
例3:
一部の出力:
start at:Thu Apr 18 16:34:53 CST 2013 current time is:Thu Apr 18 16:34:53 CST 2013 current time is:Thu Apr 18 16:34:55 CST 2013 current time is:Thu Apr 18 16:34:57 CST 2013 current time is:Thu Apr 18 16:34:59 CST 2013 current time is:Thu Apr 18 16:34:592秒間隔で繰り返し実行し、経過した時間は処理を無視する.
もう1つの方法は、タスクスケジューリングを実行するために周波数を固定する必要があります.これには、次の2つの方法が必要です.
例4
一部の出力:
start at :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:10 CST 2013current time is :Thu Apr 18 16:41:12 CST 2013current time is :Thu Apr 18 16:41:14 CST 2013current time is :Thu Apr 18 16:41:16 CST 2013
結果として、プログラムは08秒で実行を開始し、指定開始時間は00秒であり、scheduleメソッドに従ってスケジューリングタスクを設定するとすぐに実行され、スケジューリングを繰り返す
ただしscheduleAtFixedRateで設定すると、固定周波数なので、すでに「経過した時間」内に実行する必要がある回数をすべて実行し、現在の実際の時間に合わせてスケジューリングします.
再スケジュール中に、特定の理由で遅延された場合、所定のスケジュール時間と周波数で実行できない場合は、scheduleとscheduleAtFixedRateはどのように処理されますか.
例5
出力:
start at :Thu Apr 18 16:53:48 CST 2013current time is :Thu Apr 18 16:53:49 CST 2013current time is :Thu Apr 18 16:53:51 CST 2013current time is :Thu Apr 18 16:53:53 CST 2013current time is :Thu Apr 18 16:54:05 CST 2013current time is :Thu Apr 18 16:54:05 CST 2013current time is :Thu Apr 18 16:54:07 CST 2013current time is :Thu Apr 18 16:54:09 CST 2013current time is :Thu Apr 18 16:54:11 CST 2013
いずれかのタスク時間が遅延された後、再び実行が開始され、スケジューリング時間は現在の実際の時間から計算されます.また、なぜここでもう一度スケジューリングタスクを実行するのか、私はまだよく分かりません.私が設定した睡眠時間が2秒、5秒、10秒であっても、どれだけ繰り返し実行するのか、知っている友达が説明してくれませんか.ありがとうございます.
例6:
出力:start at:Thu Apr 18 16:55:16 CST 2013 c urrent time is:Thu Aprr 18 16:55:17 CST 2013 c urrent time is:Thu Aprr 18 16 16:55:19 CST 2013 c urrent time is:Thu Aprr 18 16:55:21 CST 2013 c urrent time is:Thu Aprr 18 16 16 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16 16 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16:55:33 CST 23 CST 2013 c urrent time 16:55:33 e is:Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:35 CST 2013current time is :Thu Apr 18 16:55:37 CST 2013
あるタスクが遅延されても,その後スケジューリングが再開されると,この期間内に「漏れ」したタスクが一度実行されることが分かる.
cancelメソッドでTimerタイマを終了できます.
転載先:https://www.cnblogs.com/lylyalong/archive/2013/04/18/3029039.html
まず簡単な例を見てみましょう.
例1:
import java.util.*;
import java.text.*;
public class TimerDemo{
public static void main (String [] args) throws Exception
{
Timer timer = new Timer();
System.out.println("start at :" + new Date());
timer.schedule(new TaskDemo(),5000);
}
}
class TaskDemo extends TimerTask{
public void run(){
System.out.println("current time is :" + new Date());
}
}
出力内容は、start at:Thu Apr 18 16:25:08 CST 2013 current time is:Thu Apr 18 16:25:13 CST 2013
例1 5秒の遅延後にスケジューリングタスクを実行するのは簡単です.
例2:
timer.schedule(new TaskDemo(),5000,2000);
出力結果:start at:Thu Apr 18 16:28:18 CST 2013 current time is:Thu Apr 18 16:28:23 CST 2013 current time is:Thu Apr 18 16:28:25 CST 2013 current time is:Thu Apr 18 16:28:27 CST 2013
例2は、5秒の遅延後に2秒ごとにタスクを実行する
void
schedule(TimerTask task, Date time)
void
schedule(TimerTask task, Date firstTime, long period)
上記の2つは、指定した日時から1回、または繰り返し実行されます.
最初に実行された時間fristTimeがまだ将来の時間になっていない場合、プログラムは現在の時間が指定されたfirstTimeになるまでブロックされます.
では、指定された時間が過ぎたら?例3を参照すると、プログラムはすぐに実行を開始するか、時間間隔で複数回実行されます.
例3:
Date targetStartDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2013-04-18 16:33:00");
timer.schedule(new TaskDemo(),targetStartDate,2000);
一部の出力:
start at:Thu Apr 18 16:34:53 CST 2013 current time is:Thu Apr 18 16:34:53 CST 2013 current time is:Thu Apr 18 16:34:55 CST 2013 current time is:Thu Apr 18 16:34:57 CST 2013 current time is:Thu Apr 18 16:34:59 CST 2013 current time is:Thu Apr 18 16:34:592秒間隔で繰り返し実行し、経過した時間は処理を無視する.
もう1つの方法は、タスクスケジューリングを実行するために周波数を固定する必要があります.これには、次の2つの方法が必要です.
void
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
void
scheduleAtFixedRate(TimerTask task, long delay, long period)
例4
Date targetStartDate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2013-04-18 16:41:00");
timer.scheduleAtFixedRate(new TaskDemo(),targetStartDate,2000);
一部の出力:
start at :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:08 CST 2013current time is :Thu Apr 18 16:41:10 CST 2013current time is :Thu Apr 18 16:41:12 CST 2013current time is :Thu Apr 18 16:41:14 CST 2013current time is :Thu Apr 18 16:41:16 CST 2013
結果として、プログラムは08秒で実行を開始し、指定開始時間は00秒であり、scheduleメソッドに従ってスケジューリングタスクを設定するとすぐに実行され、スケジューリングを繰り返す
ただしscheduleAtFixedRateで設定すると、固定周波数なので、すでに「経過した時間」内に実行する必要がある回数をすべて実行し、現在の実際の時間に合わせてスケジューリングします.
再スケジュール中に、特定の理由で遅延された場合、所定のスケジュール時間と周波数で実行できない場合は、scheduleとscheduleAtFixedRateはどのように処理されますか.
例5
import java.util.*;
import java.text.*;
public class TimerDemo{
public static void main (String [] args) throws Exception
{
Timer timer = new Timer();
System.out.println("start at :" + new Date());
timer.schedule(new TaskDemo(),1000,2000);
}
}
class TaskDemo extends TimerTask{
public static int count = 0 ;
public void run() {
if(count++ == 3){
try{
Thread.sleep(10000);
}catch(Exception e){}
}
System.out.println("current time is :" + new Date());
}
}
出力:
start at :Thu Apr 18 16:53:48 CST 2013current time is :Thu Apr 18 16:53:49 CST 2013current time is :Thu Apr 18 16:53:51 CST 2013current time is :Thu Apr 18 16:53:53 CST 2013current time is :Thu Apr 18 16:54:05 CST 2013current time is :Thu Apr 18 16:54:05 CST 2013current time is :Thu Apr 18 16:54:07 CST 2013current time is :Thu Apr 18 16:54:09 CST 2013current time is :Thu Apr 18 16:54:11 CST 2013
いずれかのタスク時間が遅延された後、再び実行が開始され、スケジューリング時間は現在の実際の時間から計算されます.また、なぜここでもう一度スケジューリングタスクを実行するのか、私はまだよく分かりません.私が設定した睡眠時間が2秒、5秒、10秒であっても、どれだけ繰り返し実行するのか、知っている友达が説明してくれませんか.ありがとうございます.
例6:
timer.scheduleAtFixedRate(new TaskDemo(),1000,2000);
出力:start at:Thu Apr 18 16:55:16 CST 2013 c urrent time is:Thu Aprr 18 16:55:17 CST 2013 c urrent time is:Thu Aprr 18 16 16:55:19 CST 2013 c urrent time is:Thu Aprr 18 16:55:21 CST 2013 c urrent time is:Thu Aprr 18 16 16 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16 16 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16:55:33 CST 2013 c urrent time is:Thu Aprr 18 16:55:33 CST 23 CST 2013 c urrent time 16:55:33 e is:Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:33 CST 2013current time is :Thu Apr 18 16:55:35 CST 2013current time is :Thu Apr 18 16:55:37 CST 2013
あるタスクが遅延されても,その後スケジューリングが再開されると,この期間内に「漏れ」したタスクが一度実行されることが分かる.
cancelメソッドでTimerタイマを終了できます.
転載先:https://www.cnblogs.com/lylyalong/archive/2013/04/18/3029039.html