Timer和TimerTask 方法详解

来源:互联网 发布:如何申请淘宝店铺号 编辑:程序博客网 时间:2024/06/05 10:56

第一种方法: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执行

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

[html] view plain copy
  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)。



转载地址:http://blog.csdn.net/qq_32786873/article/details/53005976


原创粉丝点击