5.1.2方法schedule(TimerTask task,Date firstTime,long period)のテスト

7550 ワード

この方法の役割は、指定された期間の後、指定された間隔で周期的に無限にタスクを実行することである.
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