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  ···