时间:2021-05-20
概述
主要用于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 2016Run 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 2016Run Time: Tue Dec 27 21:35:02 CST 2016Run Time: Tue Dec 27 21:35:07 CST 2016Run Time: Tue Dec 27 21:35:12 CST 2016Run 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 2016Run Time:Tue Dec 27 21:43:30 CST 2016Run Time:Tue Dec 27 21:43:33 CST 2016Run Time:Tue Dec 27 21:43:36 CST 2016说明指定的之间早于当前时间,则立刻执行,不会补充时间差内的任务。
scheduleAtFixedRate方法
scheduleAtFixedRate(TimerTask task, long delay, 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, 3000, 5000); }}执行结果
Now Time: Tue Dec 27 21:58:03 CST 2016Run Time: Tue Dec 27 21:58:06 CST 2016Run Time: Tue Dec 27 21:58:11 CST 2016Run Time: Tue Dec 27 21:58:16 CST 2016Run Time: Tue Dec 27 21:58:21 CST 2016说明以当前基准时间延迟3秒后执行一次,以后按指定间隔时间5秒无限次数的执行。
scheduleAtFixedRate(TimerTask task, Date firstTime, 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, date, 5000); } catch (ParseException e) { e.printStackTrace(); } } }}执行结果
Date = Tue Dec 27 22:02:00 CST 2016 NowTime = Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:54 CST 2016Run Time:Tue Dec 27 22:02:55 CST 2016Run Time:Tue Dec 27 22:03:00 CST 2016Run 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, date, 5000); } catch (ParseException e) { e.printStackTrace(); } }}执行结果
早于当前基准时间
Date = Tue Dec 27 14:36:00 CST 2016 NowTime = Tue Dec 27 22:23:37 CST 2016Begin Run Time: Tue Dec 27 22:23:37 CST 2016End Run Time: Tue Dec 27 22:23:40 CST 2016Begin Run Time: Tue Dec 27 22:23:42 CST 2016End Run Time: Tue Dec 27 22:23:45 CST 2016Begin Run Time: Tue Dec 27 22:23:47 CST 2016End Run Time: Tue Dec 27 22:23:50 CST 2016Process finished with exit code 0晚于当前基准时间
Date = Tue Dec 27 22:42:00 CST 2016 NowTime = Tue Dec 27 22:41:54 CST 2016Begin Run Time: Tue Dec 27 22:42:00 CST 2016End Run Time: Tue Dec 27 22:42:03 CST 2016Begin Run Time: Tue Dec 27 22:42:05 CST 2016End Run Time: Tue Dec 27 22:42:08 CST 2016Begin Run Time: Tue Dec 27 22:42:10 CST 2016End Run Time: Tue Dec 27 22:42:13 CST 2016Process finished with exit code 0不管早还是晚于基准时间,都不进行补偿,下一次任务的执行时间参考的是上一次任务的开始时间点来计算。
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(5000); 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 22:42: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 22:42:00 CST 2016 NowTime = Tue Dec 27 22:45:17 CST 2016Begin Run Time: Tue Dec 27 22:45:17 CST 2016End Run Time: Tue Dec 27 22:45:22 CST 2016Begin Run Time: Tue Dec 27 22:45:22 CST 2016End Run Time: Tue Dec 27 22:45:27 CST 2016Begin Run Time: Tue Dec 27 22:45:27 CST 2016End Run Time: Tue Dec 27 22:45:32 CST 2016Process finished with exit code 0晚于当前基准时间
Date = Tue Dec 27 22:47:00 CST 2016 NowTime = Tue Dec 27 22:46:27 CST 2016Begin Run Time: Tue Dec 27 22:47:00 CST 2016End Run Time: Tue Dec 27 22:47:05 CST 2016Begin Run Time: Tue Dec 27 22:47:05 CST 2016End Run Time: Tue Dec 27 22:47:10 CST 2016Begin Run Time: Tue Dec 27 22:47:10 CST 2016End Run Time: Tue Dec 27 22:47:15 CST 2016Process finished with exit code 0不管早还是晚于当前基准时间,都不进行补偿,下一次任务的执行时间都是参考上一次任务结束的时间点来计算。
scheduleAtFixedRate不延时
使用示例
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 == 1000) { 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 22:51:42"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.scheduleAtFixedRate(task, date, 5000); } catch (ParseException e) { e.printStackTrace(); } }}执行结果
早于当前基准时间
Date = Tue Dec 27 22:51:42 CST 2016 NowTime = Tue Dec 27 22:51:57 CST 2016Begin Run Time: Tue Dec 27 22:51:57 CST 2016End Run Time: Tue Dec 27 22:52:00 CST 2016Begin Run Time: Tue Dec 27 22:52:00 CST 2016End Run Time: Tue Dec 27 22:52:03 CST 2016Begin Run Time: Tue Dec 27 22:52:03 CST 2016End Run Time: Tue Dec 27 22:52:06 CST 2016Begin Run Time: Tue Dec 27 22:52:06 CST 2016End Run Time: Tue Dec 27 22:52:09 CST 2016Begin Run Time: Tue Dec 27 22:52:09 CST 2016End Run Time: Tue Dec 27 22:52:12 CST 2016Begin Run Time: Tue Dec 27 22:52:12 CST 2016End Run Time: Tue Dec 27 22:52:15 CST 2016Begin Run Time: Tue Dec 27 22:52:15 CST 2016End Run Time: Tue Dec 27 22:52:18 CST 2016Begin Run Time: Tue Dec 27 22:52:18 CST 2016End Run Time: Tue Dec 27 22:52:21 CST 2016Begin Run Time: Tue Dec 27 22:52:22 CST 2016End Run Time: Tue Dec 27 22:52:25 CST 2016Begin Run Time: Tue Dec 27 22:52:27 CST 2016End Run Time: Tue Dec 27 22:52:30 CST 2016Begin Run Time: Tue Dec 27 22:52:32 CST 2016End Run Time: Tue Dec 27 22:52:35 CST 2016Begin Run Time: Tue Dec 27 22:52:37 CST 2016End Run Time: Tue Dec 27 22:52:40 CST 2016Begin Run Time: Tue Dec 27 22:52:42 CST 2016End Run Time: Tue Dec 27 22:52:45 CST 2016Begin Run Time: Tue Dec 27 22:52:47 CST 2016End Run Time: Tue Dec 27 22:52:50 CST 2016Begin Run Time: Tue Dec 27 22:52:52 CST 2016End Run Time: Tue Dec 27 22:52:55 CST 2016Begin Run Time: Tue Dec 27 22:52:57 CST 2016End Run Time: Tue Dec 27 22:53:00 CST 2016Process finished with exit code 0晚于当前基准时间
Date = Tue Dec 27 22:37:00 CST 2016 NowTime = Tue Dec 27 22:36:06 CST 2016Begin Run Time: Tue Dec 27 22:37:00 CST 2016End Run Time: Tue Dec 27 22:37:03 CST 2016Begin Run Time: Tue Dec 27 22:37:05 CST 2016End Run Time: Tue Dec 27 22:37:08 CST 2016Begin Run Time: Tue Dec 27 22:37:10 CST 2016End Run Time: Tue Dec 27 22:37:13 CST 2016Process finished with exit code 0不延时的情况下,当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次执行任务的结束时间;一旦补偿完毕(注意粗体时间点),下一次执行任务的时间参考的是上一次执行任务的开始时间;当晚于基准时间时,下一次执行任务的时间参考的是上一次执行任务的开始时间。
scheduleAtFixedRate延时
使用示例
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(5000); 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 22:28:00"; Date date = sdf.parse(dateStr); System.out.println("Date = " + date.toString() + " NowTime = " + new Date().toString()); timer.scheduleAtFixedRate(task, date, 3000); } catch (ParseException e) { e.printStackTrace(); } }}执行结果
早于当前基准时间
Date = Tue Dec 27 23:01:00 CST 2016 NowTime = Tue Dec 27 23:01:19 CST 2016Begin Run Time: Tue Dec 27 23:01:19 CST 2016End Run Time: Tue Dec 27 23:01:24 CST 2016Begin Run Time: Tue Dec 27 23:01:24 CST 2016End Run Time: Tue Dec 27 23:01:29 CST 2016Begin Run Time: Tue Dec 27 23:01:29 CST 2016End Run Time: Tue Dec 27 23:01:34 CST 2016Begin Run Time: Tue Dec 27 23:01:34 CST 2016End Run Time: Tue Dec 27 23:01:39 CST 2016晚于当前基准时间
Date = Tue Dec 27 22:28:00 CST 2016 NowTime = Tue Dec 27 22:27:55 CST 2016Begin Run Time: Tue Dec 27 22:28:00 CST 2016End Run Time: Tue Dec 27 22:28:05 CST 2016Begin Run Time: Tue Dec 27 22:28:05 CST 2016End Run Time: Tue Dec 27 22:28:10 CST 2016Begin Run Time: Tue Dec 27 22:28:10 CST 2016End Run Time: Tue Dec 27 22:28:15 CST 2016Process finished with exit code 0延时的情况下,即使是早于基准时间,由于延时效应,根本不可能补偿完毕时间差内的执行任务,故而在延时的情况下,下一次任务的执行时间都是参考上一次任务结束的时间来计算。
对比总结
执行任务不延时 执行任务延时 早于当前基准时间 schedule:下一次任务的执行时间参考的是上一次任务的开始时间来计算。 scheduleAtFixedRate:当早于基准时间时,时间差内的执行任务未补偿完时,下一次执行任务的时间参考的是上一次任务的结束时间;一旦补偿完毕,下一次执行任务的时间参考上一次任务的开始时间来计算。 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。 晚于当前基准时间 二者一样。下一次任务的执行时间参考的是上一次任务的开始时间来计算。 二者一样。下一次任务的执行时间都是参考上一次任务的结束时间来计算。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
javaTimer定时器简单实例代码:publicclassTest{publicstaticvoidmain(String[]args){//Timer定时器
最近要用到定时任务,就是超过48小时的数据给关闭,前台就不显示了。还是头一次使用java的定时器,。。java定时器使用Timer类。有时间得看下源码了,看看具
Android中实现定时器的四种方式第一种方式利用Timer和TimerTask1、继承关系java.util.Timer基本方法schedule例如:time
在Java中Timer是java.util包中的一个工具类,提供了定时器的功能。我们可以创建一个Timer对象,然后调用其schedule方法在某个特定的时间去
本文通过一个实例讲解了在Silverlight中使用定时器(Timer)的功能。Timer定时器经常用于每隔一段特定的时间后触发某一指定的事件,如刷新、定时提醒