1. 程式人生 > >Java多執行緒(十四):Timer

Java多執行緒(十四):Timer

Timer

schedule(TimerTask task, Date time)

該方法在指定日期執行任務,如果是過去的時間,這個任務會立即被執行。
執行時間早於當前時間
示例程式碼,當前時間是2019年9月19日,程式碼中寫的是前一天的時間。

public class MyTask1 extends TimerTask {
    private static Timer timer = new Timer();

    public void run()
    {
        System.out.println("運行了!時間為:" + new Date());
    }

    public static void main(String[] args) throws Exception
    {
        MyTask1 task = new MyTask1();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2019-9-18 21:22:00";
        Date dateRef = sdf.parse(dateString);
        System.out.println("字串時間:" + dateRef.toLocaleString() + " 當前時間:" + new Date().toLocaleString());
        timer.schedule(task, dateRef);
    }
}

執行結果如下

字串時間:2019-9-18 21:22:00 當前時間:2019-9-19 20:18:26
運行了!時間為:Thu Sep 19 20:18:26 CEST 2019

可以看到,過去的時間立即執行。
執行時間晚於當前時間
修改程式碼的dateString改為未來的時間,如"2019-9-19 20:22:00"
執行結果如下

字串時間:2019-9-19 20:22:00 當前時間:2019-9-19 20:21:22
運行了!時間為:Thu Sep 19 20:22:00 CEST 2019

可以看到,未來的時間要等到目標時間才會執行。
多個Timer同時執行
示例程式碼如下

public class MyTask2 extends TimerTask {
    private static Timer timer = new Timer();

    public void run()
    {
        System.out.println("運行了!時間為:" + new Date());
    }

    public static void main(String[] args) throws Exception
    {
        MyTask2 task1 = new MyTask2();
        MyTask2 task2 = new MyTask2();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString1 = "2019-9-19 21:12:00";
        String dateString2 = "2019-9-19 21:12:00";
        Date dateRef1 = sdf1.parse(dateString1);
        Date dateRef2 = sdf2.parse(dateString2);
        System.out.println("字串時間:" + dateRef1.toLocaleString() + " 當前時間:" + new Date().toLocaleString());
        System.out.println("字串時間:" + dateRef2.toLocaleString() + " 當前時間:" + new Date().toLocaleString());
        timer.schedule(task1, dateRef1);
        timer.schedule(task2, dateRef2);
    }
}

執行結果如下

字串時間:2019-9-19 21:12:00 當前時間:2019-9-19 21:11:57
字串時間:2019-9-19 21:12:00 當前時間:2019-9-19 21:11:57
運行了!時間為:Thu Sep 19 21:12:00 CEST 2019
運行了!時間為:Thu Sep 19 21:12:00 CEST 2019

說明可以多工執行。執行時間和當前時間的關係規則同上。

schedule(TimerTask task, Date firstTime, long period)

該方法在指定的時間執行任務,間隔period時間再次執行,無限迴圈。
執行時間早於當前時間
示例程式碼

public class MyTask3 extends TimerTask {
    public void run()
    {
        System.out.println("運行了!時間為:" + new Date());
    }

    public static void main(String[] args) throws Exception
    {
        MyTask3 task = new MyTask3();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2019-09-19 22:01:00";
        Timer timer = new Timer();
        Date dateRef = sdf.parse(dateString);
        System.out.println("字串時間:" + dateRef.toLocaleString() + " 當前時間:" + new Date().toLocaleString());
        timer.schedule(task, dateRef, 4000);
    }
}

執行結果如下

字串時間:2019-9-19 22:01:00 當前時間:2019-9-19 22:09:13
運行了!時間為:Thu Sep 19 22:09:13 CEST 2019
運行了!時間為:Thu Sep 19 22:09:17 CEST 2019
運行了!時間為:Thu Sep 19 22:09:21 CEST 2019
運行了!時間為:Thu Sep 19 22:09:25 CEST 2019
···

可以看到,立即執行。
執行時間晚於當前時間
執行結果如下

字串時間:2019-9-19 22:12:00 當前時間:2019-9-19 22:11:24
運行了!時間為:Thu Sep 19 22:12:00 CEST 2019
運行了!時間為:Thu Sep 19 22:12:04 CEST 2019
運行了!時間為:Thu Sep 19 22:12:08 CEST 2019
運行了!時間為:Thu Sep 19 22:12:12 CEST 2019
運行了!時間為:Thu Sep 19 22:12:16 CEST 2019
···