您的位置:首页 > 其它

Timer和TimerTask 方法详解

2017-12-19 17:45 330 查看
第一种方法: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

package test;  

  

import java.util.Calendar;  

import java.util.Date;  

import java.util.Timer;  

import java.util.TimerTask;  

  

/** 

 * @author Solin 

 * 

 */  

public class TimeTest {  

    public static void main(String[] args) {  

        timer1();  

    }  

      

    /** 

     * 第一种方法:设定指定任务task在指定延迟delay后执行 

     * schedule(TimerTask task, long delay) 

     */  

    public static void timer1(){  

        Timer timer = new Timer();  

        timer.schedule(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println("设定指定任务task在指定延迟delay后执行");  

            }  

        }, 2000);  

    }  

      

    /** 

     * 第二种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行   

     * schedule(TimerTask task, long delay, long period) 

     */  

    public static void timer2(){  

        Timer timer = new Timer();  

        timer.schedule(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println(new Date()+"  设定指定任务task在指定延迟delay后进行固定频率peroid的执行");  

            }  

        }, 1000, 2000);  

    }  

      

      

    /** 

     * 第三种方法:设定指定任务task在指定时间time执行  

     * schedule(TimerTask task,Date time) 

     */  

    public static void timer3(){  

        Calendar calendar = Calendar.getInstance();      

        calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时      

        calendar.set(Calendar.MINUTE, 42);    // 控制分      

        calendar.set(Calendar.SECOND,55);    // 控制秒       

        Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00       

        Timer timer = new Timer();  

        timer.schedule(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println("设定指定任务task在指定时间time执行");  

            }  

        }, time);  

    }  

      

    /** 

     * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 

     * schedule(TimerTask task,Date firstTime,long period) 

     */  

    public static void timer4(){  

        Calendar calendar = Calendar.getInstance();      

        calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时      

        calendar.set(Calendar.MINUTE, 42);    // 控制分      

        calendar.set(Calendar.SECOND,55);    // 控制秒       

        Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00       

        Timer timer = new Timer();  

        timer.schedule(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");  

            }  

        }, time,2000);  

    }  

      

    /** 

     * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行   

     * scheduleAtFixedRate(TimerTask task, long delay, long period) 

     */  

    public static void timer5(){  

        Timer timer = new Timer();  

        timer.scheduleAtFixedRate(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println(new Date()+"  设定指定任务task在指定延迟delay后进行固定频率peroid的执行");  

            }  

        }, 1000, 2000);  

    }  

      

    /** 

     * 第六种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 

     * scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 

     */  

    public static void timer6(){  

        Calendar calendar = Calendar.getInstance();      

        calendar.set(Calendar.HOUR_OF_DAY, 10); // 控制时      

        calendar.set(Calendar.MINUTE, 42);    // 控制分      

        calendar.set(Calendar.SECOND,55);    // 控制秒       

        Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的12:00:00       

        Timer timer = new Timer();  

        timer.scheduleAtFixedRate(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");  

            }  

        }, time,2000);  

    }  

}  

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

[html] view
plain copy

public static void timer6(){  

        Calendar calendar = Calendar.getInstance();      

        calendar.set(Calendar.HOUR_OF_DAY, 11); // 控制时      

        calendar.set(Calendar.MINUTE, 20);    // 控制分      

        calendar.set(Calendar.SECOND,00);    // 控制秒       

        Date time = calendar.getTime();     // 得出执行任务的时间,此处为今天的11:20:00       

        Timer timer = new Timer();  

        timer.scheduleAtFixedRate(new TimerTask() {  

            @Override  

            public void run() {  

                System.out.println(new Date()+"  安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行");  

            }  

        }, time,60*1000);  

    }  

间隔时间是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: