Java定时器Timer简述
概述 主要用于Java线程里指定时间或周期运行任务。Timer是线程安全的,但不提供实时性(real-time)保证。 构造函数 Timer() 默认构造函数。 Timer(boolean) 指定关联线程是否作为daemon线程。 Timer(String) 指定关联线程的名称。 Timer(String,boolean) 同时指定关联线程的名称和是否作为daemon。 schdule方法 schedule(TimerTask task,long delay) 以当前时间为基准,延迟指定的毫秒后执行一次TimerTask任务。 schedule(TimerTask task,Date time) 在指定的日期执行一次TimerTask任务。 如果日期time早于当前时间,则立刻执行。 使用示例 public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() { System.out.println("Run Time:" + new Date().toString()); } } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = "2016-12-27 14:36:00"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.schedule(task,date); } catch (ParseException e) { e.printStackTrace(); } } } 执行结果 Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:28:04 CST 2016 Run Time:Tue Dec 27 21:28:04 CST 2016 说明是立刻执行。 schedule(TimerTask task,long delay,long period) 以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delay execution) 使用示例 public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() { System.out.println("Run Time: " + new Date().toString()); } } public static void main(String[] args) { MyTask task = new MyTask(); System.out.println("Now Time: " + new Date().toString()); timer.schedule(task,3000,5000); } } 执行结果 Now Time: Tue Dec 27 21:34:59 CST 2016 Run Time: Tue Dec 27 21:35:02 CST 2016 Run Time: Tue Dec 27 21:35:07 CST 2016 Run Time: Tue Dec 27 21:35:12 CST 2016 Run Time: Tue Dec 27 21:35:17 CST 2016 说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。 schedule(TimerTask task,Date firstTime,long period) 在指定的日期之后,按指定的时间间隔地无限次数的执行TimerTask任务。(fixed-delay execution) 如果日期firstTime早于当前时间,则立刻执行,且不执行在时间差内的任务。 使用示例 public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() { System.out.println("Run Time:" + new Date().toString()); } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = "2016-12-27 14:36:00"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.schedule(task,date,3000); } catch (ParseException e) { e.printStackTrace(); } } } } 执行结果 Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 21:43:30 CST 2016 Run Time:Tue Dec 27 21:43:30 CST 2016 Run Time:Tue Dec 27 21:43:33 CST 2016 Run Time:Tue Dec 27 21:43:36 CST 2016 说明指定的之间早于当前时间,则立刻执行,不会补充时间差内的任务。 scheduleAtFixedRate方法 scheduleAtFixedRate(TimerTask task,long period) 以当前时间为基准,延迟指定的毫秒后,再按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rate execution) 使用示例 public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() { System.out.println("Run Time: " + new Date().toString()); } } public static void main(String[] args) { MyTask task = new MyTask(); System.out.println("Now Time: " + new Date().toString()); timer.scheduleAtFixedRate(task,5000); } } 执行结果 Now Time: Tue Dec 27 21:58:03 CST 2016 Run Time: Tue Dec 27 21:58:06 CST 2016 Run Time: Tue Dec 27 21:58:11 CST 2016 Run Time: Tue Dec 27 21:58:16 CST 2016 Run Time: Tue Dec 27 21:58:21 CST 2016 说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。 scheduleAtFixedRate(TimerTask task,long period) 在指定的日期之后,按指定的时间间隔周期性地无限次数的执行TimerTask任务。(fixed-rate execution) 如果日期firstTime早于当前时间,则立即执行,并补充性的执行在时间差内的任务。 使用示例 public class Demo { private static Timer timer = new Timer(); public static class MyTask extends TimerTask { @Override public void run() { System.out.println("Run Time:" + new Date().toString()); } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = "2016-12-27 22:02:00"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.scheduleAtFixedRate(task,5000); } catch (ParseException e) { e.printStackTrace(); } } } } 执行结果 Date = Tue Dec 27 22:02:00 CST 2016 NowTime = Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:54 CST 2016 Run Time:Tue Dec 27 22:02:55 CST 2016 Run Time:Tue Dec 27 22:03:00 CST 2016 Run Time:Tue Dec 27 22:03:05 CST 2016 说明指定的之间早于当前时间,则立刻执行。 在时间22:02:00--22:02:54内大约有11个5秒间隔,则优先补充性的执行在时间差内的任务,然后在22:02:55补充完毕(执行12次。ps:0-55秒区间段内首位都算上,正好触发12次),此后每隔5秒执行一次定时任务。 执行任务延时对比之 schedule 和 scheduleAtFixedRate schedule不延时 使用示例 public class Demo { private static Timer timer = new Timer(); private static int runCount = 0; public static class MyTask extends TimerTask { @Override public void run() { try { System.out.println("Begin Run Time: " + new Date().toString()); Thread.sleep(3000); System.out.println("End Run Time: " + new Date().toString()); runCount++; if (runCount == 3) { timer.cancel(); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStr = "2016-12-27 14:36:00"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.schedule(task,5000); } catch (ParseException e) { e.printStackTrace(); } } } 执行结果 早于当前基准时间 Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 22:23:37 CST 2016 Begin Run Time: Tue Dec 27 22:23:37 CST 2016 End Run Time: Tue Dec 27 22:23:40 CST 2016 Begin Run Time: Tue Dec 27 22:23:42 CST 2016 End Run Time: Tue Dec 27 22:23:45 CST 2016 Begin Run Time: Tue Dec 27 22:23:47 CST 2016 End Run Time: Tue Dec 27 22:23:50 CST 2016 Process finished with exit code 0 晚于当前基准时间 Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:41:54 CST 2016 Begin Run Time: Tue Dec 27 22:42:00 CST 2016 End Run Time: Tue Dec 27 22:42:03 CST 2016 Begin Run Time: Tue Dec 27 22:42:05 CST 2016 End Run Time: Tue Dec 27 22:42:08 CST 2016 Begin Run Time: Tue Dec 27 22:42:10 CST 2016 End Run Time: Tue Dec 27 22:42:13 CST 2016 Process finished with exit code 0 不管早还是晚于基准时间,都不进行补偿,下一次任务的执行时间参考的是上一次任务的开始时间点来计算。 schedule延时 (编辑:4S站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |