5.1.2方法schedule(TimerTask task,Date firstTime,long period)のテスト
7550 ワード
この方法の役割は、指定された期間の後、指定された間隔で周期的に無限にタスクを実行することである.
1.計画タスクが現在のタスクより後:将来実行される効果
プログラムの実行結果は次のとおりです.
実行結果から4秒ごとにTimerTaskタスクを実行し,無期限に繰り返し実行する.
2.計画タスクが現在時刻より早い:繰り上げ実行の効果計画時間が現在時刻より早い場合、taskタスクを直ちに実行します.
プログラムの実行結果は次のとおりです.
3.タスク実行時間の遅延
プログラムの実行結果:
タスクは遅延されましたが、順番に実行されます.
4.TimerTaskクラスのcancel()メソッド
TimerTaskクラスのcancel()メソッドの役割は、タスクキューから自身を消去することです.
プログラムの実行結果:
TimerTaskクラスのcancel()メソッドは、他のタスクに影響を与えないタスクキューから自身を削除することです.
5.Timerクラスのcancel()メソッドは、TimerTaskクラスのcancel()メソッドとは異なり、Timerクラスのcancel()メソッドは、タスクキュー内のすべてのタスクを空にする役割を果たします.
プログラムの実行結果は次のとおりです.
すべてのタスクがクリアされ、プロセスが破棄され、ボタンが赤からグレーに変わります.
6.Timerのcancel()メソッドの注意事項Timerクラスのcancel()メソッドは、計画タスクの実行を必ず停止し、正常に実行する場合があります.
プログラムの実行後の結果の一部は次のとおりです.
これは、Timerクラスのcancel()メソッドがqueueロックを競合していない場合があるため、TimerTaskクラスのタスクは正常に実行されます.
Javaマルチスレッドコアプログラミング技術から抜粋-5.1.2
1.計画タスクが現在のタスクより後:将来実行される効果
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
static public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println(" ! :"+new Date());
}
}
public static void main(String[] args) {
try{
MyTask task=new MyTask();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString="2017-5-15 8:09:00";
Timer timer=new Timer();
Date dateRef=sdf.parse(dateString);
System.out.println(" :"+dateRef.toString()+" :"+new Date().toString());
timer.schedule(task,dateRef,4000);
}catch (ParseException e) {
e.printStackTrace();
}
}
}
プログラムの実行結果は次のとおりです.
:Tue May 16 08:09:00 CST 2017 :Tue May 16 08:22:17 CST 2017
! :Tue May 16 08:22:17 CST 2017
! :Tue May 16 08:22:21 CST 2017
! :Tue May 16 08:22:25 CST 2017
! :Tue May 16 08:22:29 CST 2017
実行結果から4秒ごとにTimerTaskタスクを実行し,無期限に繰り返し実行する.
2.計画タスクが現在時刻より早い:繰り上げ実行の効果計画時間が現在時刻より早い場合、taskタスクを直ちに実行します.
public static void main(String[] args) {
try{
MyTask task=new MyTask();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString="2017-5-15 8:09:00";
Timer timer=new Timer();
Date dateRef=sdf.parse(dateString);
System.out.println(" :"+dateRef.toString()+" :"+new Date().toString());
timer.schedule(task,dateRef,4000);
}catch (ParseException e) {
e.printStackTrace();
}
}
プログラムの実行結果は次のとおりです.
:Mon May 15 08:09:00 CST 2017 :Tue May 16 08:30:33 CST 2017
! :Tue May 16 08:30:33 CST 2017
! :Tue May 16 08:30:37 CST 2017
! :Tue May 16 08:30:41 CST 2017
3.タスク実行時間の遅延
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
static public class MyTaskA extends TimerTask {
@Override
public void run() {
try {
System.out.println("A ! :" + new Date());
Thread.sleep(5000);
System.out.println("A ! :" + new Date());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
MyTaskA taskA = new MyTaskA();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-5-15 8:09:00";
Timer timer = new Timer();
Date dateRef = sdf.parse(dateString);
System.out.println(" :" + dateRef.toString() + " :" + new Date().toString());
timer.schedule(taskA, dateRef, 4000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
プログラムの実行結果:
:Mon May 15 08:09:00 CST 2017 :Tue May 16 08:39:18 CST 2017
A ! :Tue May 16 08:39:18 CST 2017
A ! :Tue May 16 08:39:23 CST 2017
A ! :Tue May 16 08:39:23 CST 2017
A ! :Tue May 16 08:39:28 CST 2017
タスクは遅延されましたが、順番に実行されます.
4.TimerTaskクラスのcancel()メソッド
TimerTaskクラスのcancel()メソッドの役割は、タスクキューから自身を消去することです.
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
static public class MyTaskA extends TimerTask {
@Override
public void run() {
System.out.println("A ! :" + new Date());
this.cancel();
}
}
static public class MyTaskB extends TimerTask {
@Override
public void run() {
System.out.println("B ! :" + new Date());
}
}
public static void main(String[] args) {
try {
MyTaskA taskA = new MyTaskA();
MyTaskB taskB = new MyTaskB();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-5-18 8:09:00";
Timer timer = new Timer();
Date dateRef = sdf.parse(dateString);
System.out.println(" :" + dateRef.toString() + " :" + new Date().toString());
timer.schedule(taskA, dateRef, 4000);
timer.schedule(taskB, dateRef, 4000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
プログラムの実行結果:
:Thu May 18 08:09:00 CST 2017 :Thu May 18 08:47:24 CST 2017
A ! :Thu May 18 08:47:24 CST 2017
B ! :Thu May 18 08:47:24 CST 2017
B ! :Thu May 18 08:47:28 CST 2017
TimerTaskクラスのcancel()メソッドは、他のタスクに影響を与えないタスクキューから自身を削除することです.
5.Timerクラスのcancel()メソッドは、TimerTaskクラスのcancel()メソッドとは異なり、Timerクラスのcancel()メソッドは、タスクキュー内のすべてのタスクを空にする役割を果たします.
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
private static Timer timer=new Timer();
static public class MyTaskA extends TimerTask {
@Override
public void run() {
System.out.println("A ! :" + new Date());
timer.cancel();
}
}
static public class MyTaskB extends TimerTask {
@Override
public void run() {
System.out.println("B ! :" + new Date());
}
}
public static void main(String[] args) {
try {
MyTaskA taskA = new MyTaskA();
MyTaskB taskB = new MyTaskB();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-5-18 8:09:00";
Date dateRef = sdf.parse(dateString);
System.out.println(" :" + dateRef.toString() + " :" + new Date().toString());
timer.schedule(taskA, dateRef, 4000);
timer.schedule(taskB, dateRef, 4000);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
プログラムの実行結果は次のとおりです.
:Thu May 18 08:09:00 CST 2017 :Thu May 18 08:56:39 CST 2017
A ! :Thu May 18 08:56:39 CST 2017
すべてのタスクがクリアされ、プロセスが破棄され、ボタンが赤からグレーに変わります.
6.Timerのcancel()メソッドの注意事項Timerクラスのcancel()メソッドは、計画タスクの実行を必ず停止し、正常に実行する場合があります.
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
static int i=0;
static public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println(" " +i);
}
}
public static void main(String[] args) {
while (true) {
try {
i++;
Timer timer = new Timer();
MyTask task = new MyTask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2017-5-18 8:09:00";
Date dateRef = sdf.parse(dateString);
timer.schedule(task, dateRef);
timer.cancel();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
プログラムの実行後の結果の一部は次のとおりです.
2
163
347
542
622
739
751
852
1233
これは、Timerクラスのcancel()メソッドがqueueロックを競合していない場合があるため、TimerTaskクラスのタスクは正常に実行されます.
Javaマルチスレッドコアプログラミング技術から抜粋-5.1.2