Java多執行緒(十四):Timer
- 2019 年 10 月 3 日
- 筆記
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 ···