java中定时器Timer/TimerTask的使用方法

深藏阁楼爱情的钟 2022-07-15 04:24 343阅读 0赞

第一种方法:schedule(TimerTask task, long delay) 设定指定任务task在指定延迟delay后执行

第二种方法:schedule(TimerTask task, long delay, long period) 设定指定任务task在指定延迟delay后进行固定频率peroid的执行

第三种方法:schedule(TimerTask task,Date time) 设定指定任务task在指定时间time执行

第四种方法:schedule(TimerTask task,Date firstTime,long period) 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行

第五种方法:scheduleAtFixedRate(TimerTask task, long delay, long period) 设定指定任务task在指定延迟delay后进行固定频率peroid的执行

第六种方法:scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行

  1. package test;
  2. import java.util.Calendar;
  3. import java.util.Date;
  4. import java.util.Timer;
  5. import java.util.TimerTask;
  6. /**
  7. * @author Solin
  8. *
  9. */
  10. public class TimeTest {
  11. public static void main(String[] args) {
  12. timer1();
  13. }
  14. /**
  15. * 第一种方法:设定指定任务task在指定延迟delay后执行
  16. * schedule(TimerTask task, long delay)
  17. */
  18. public static void timer1(){
  19. Timer timer = new Timer();
  20. timer.schedule(new TimerTask() {
  21. @Override
  22. public void run() {
  23. System.out.println("设定指定任务task在指定延迟delay后执行");
  24. }
  25. }, 2000);
  26. }
  27. /**
  28. * 第二种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行
  29. * schedule(TimerTask task, long delay, long period)
  30. */
  31. public static void timer2(){
  32. Timer timer = new Timer();
  33. timer.schedule(new TimerTask() {
  34. @Override
  35. public void run() {
  36. System.out.println(new Date()+" 设定指定任务task在指定延迟delay后进行固定频率peroid的执行");
  37. }
  38. }, 1000, 2000);
  39. }
  40. /**
  41. * 第三种方法:设定指定任务task在指定时间time执行
  42. * schedule(TimerTask task,Date time)
  43. */
  44. public static void timer3(){
  45. Calendar calendar = Calendar.getInstance();
  46. calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时
  47. calendar.set(Calendar.MINUTE, 42); // 控制分
  48. calendar.set(Calendar.SECOND,55); // 控制秒
  49. Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
  50. Timer timer = new Timer();
  51. timer.schedule(new TimerTask() {
  52. @Override
  53. public void run() {
  54. System.out.println("设定指定任务task在指定时间time执行");
  55. }
  56. }, time);
  57. }
  58. /**
  59. * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
  60. * schedule(TimerTask task,Date firstTime,long period)
  61. */
  62. public static void timer4(){
  63. Calendar calendar = Calendar.getInstance();
  64. calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时
  65. calendar.set(Calendar.MINUTE, 42); // 控制分
  66. calendar.set(Calendar.SECOND,55); // 控制秒
  67. Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
  68. Timer timer = new Timer();
  69. timer.schedule(new TimerTask() {
  70. @Override
  71. public void run() {
  72. System.out.println(new Date()+" 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
  73. }
  74. }, time,2000);
  75. }
  76. /**
  77. * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行
  78. * scheduleAtFixedRate(TimerTask task, long delay, long period)
  79. */
  80. public static void timer5(){
  81. Timer timer = new Timer();
  82. timer.scheduleAtFixedRate(new TimerTask() {
  83. @Override
  84. public void run() {
  85. System.out.println(new Date()+" 设定指定任务task在指定延迟delay后进行固定频率peroid的执行");
  86. }
  87. }, 1000, 2000);
  88. }
  89. /**
  90. * 第六种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
  91. * scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
  92. */
  93. public static void timer6(){
  94. Calendar calendar = Calendar.getInstance();
  95. calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时
  96. calendar.set(Calendar.MINUTE, 42); // 控制分
  97. calendar.set(Calendar.SECOND,55); // 控制秒
  98. Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00
  99. Timer timer = new Timer();
  100. timer.scheduleAtFixedRate(new TimerTask() {
  101. @Override
  102. public void run() {
  103. System.out.println(new Date()+" 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
  104. }
  105. }, time,2000);
  106. }
  107. }

schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。
比如:

  1. public static void timer6(){
  2. Calendar calendar = Calendar.getInstance();
  3. calendar.set(Calendar.HOUR_OF_DAY, 11); // 控制时
  4. calendar.set(Calendar.MINUTE, 20); // 控制分
  5. calendar.set(Calendar.SECOND,00); // 控制秒
  6. Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的11:20:00
  7. Timer timer = new Timer();
  8. timer.scheduleAtFixedRate(new TimerTask() {
  9. @Override
  10. public void run() {
  11. System.out.println(new Date()+" 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");
  12. }
  13. }, time,60*1000);
  14. }

间隔时间是1分钟,指定开始时间是今天的 11:20:00,如果我在11:24:30执行这个程序,那么会立刻打印5次

Wed Nov 02 11:24:30 CST 2016 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:20:00
Wed Nov 02 11:24:30 CST 2016 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:21:00
Wed Nov 02 11:24:30 CST 2016 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:22:00
Wed Nov 02 11:24:30 CST 2016 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:23:00
Wed Nov 02 11:24:30 CST 2016 安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 //11:24:00

并且注意,下一次执行是在11:25:00 而不是 11:25:30。就是说是从指定的开始时间开始计时,而不是从执行时间开始计时。

但是上面如果用schedule方法,间隔时间是1分钟,指定开始时间今天11:20:00,那么在11:24:30执行这个程序,则立即执行程序一次。并且下一次的执行时间是11:25:30,而不是从11:20:00开始算的周期(11:25:00)。

发表评论

表情:
评论列表 (有 0 条评论,343人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java定时器

    Timer 和 Timer Task 的使用 Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务,这些任务可以被执行一次,也可以被定期执行。每个 Timer 对

    相关 定时器使用方法总结

    首先理解看门狗定时器方式的使用,简单说,就是有个控制器,选择时钟源,计数方式,等等的控制参数,再配合一个一个累加计数器来确定时间,通过固定的时间间隔来执行中断函数,来得到自己想