【java】定时器

 

总结

1、执行计划的任务放在TimerTask的子类中,由Timer进行该任务。

2、创建一个Timer就是启动一个新的线程,直至Timer里的任务执行完毕,才会结束。希望创建的线程为守护线程,则创建时需设置Timer timer=new Timer(true);

3、执行任务的时间早于当前时间,任务会立即执行。

4、TimerTask是以队列的方式一个个顺序执行的。当前面的任务消耗时间较长,则后面的任务运行的时间也会延后。

比如,假定Task1执行需2s,Task2在Task1开始之后1s需被执行。结果是执行完Task1后,立即执行Task2。(实际也符合第3点)

5、如果没有延迟,则执行任务的时间是上一次任务开始的时间加上poried的时间。如果延迟了,则执行任务的时间为上一个任务的结束时间。(补充第4条)

6、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。(下面由代码解释)

7、异常方面。如果timer中执行任务时发生异常,则结束该timer线程,不会在执行任何任务。

 

常用例子

1、示例

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
 * Created by zay on 2016/12/8.
 */

public class TimerTest {
    public static void main(String[] args) {
        System.out.println("当前时间:"+new Date());

        //执行计划的任务放在TimerTask的子类中,由Timer进行该任务。
        Timer timer = new Timer();

        //创建一个任务,1s后开始执行,并此后每隔2s执行。
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(new Date() + "任务一");
            }
        },1000,2000);

        //创建一个任务,十天后执行。
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DATE,1);
        Date runDate = calendar.getTime();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(new Date() + "任务二");
            }
        },runDate);
        
        //timer.cancel();  调用TImer的cancel()方法会清空该TImer的所有任务。
        //timerTask.cancel();  调用TImerTask的cancel()方法则会在TImer中取消该任务。
    }
}

 2、方法schedule和scheduleAtFixedRate的区别在于后者有追赶执行性。

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by zay on 2016/12/8.
 */
public class TimerTest {
    public static void main(String[] args) {
        System.out.println("当前时间:"+new Date());

        Calendar calendar=Calendar.getInstance();
        calendar.add(Calendar.SECOND,-100);   //设置一个比较早的时间
        Date earlyDate = calendar.getTime();

        Timer timer = new Timer();
        System.out.printf(new Date() + " 现在开始执行任务");
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(new Date() + " 任务一");
            }
        },earlyDate,5000);

        /*timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(new Date() + " 任务一");
            }
        },earlyDate,5000);*/

    }
}

 

// schedule方法的输出(注意比对执行任务的时间)                //scheduleAtFixedRate方法的输出

     

解释:当执行任务的时间早于当前时间时,比如示例中,执行任务的时间早于当前任务100s,那么这段时间理论应该有的任务怎么处理呢?

schedule选择抛弃不理,以当前的时间为新的起点,而scheduleAtFiexdRate则会一口气将这些任务顺序都执行完毕。

 

posted @ 2016-12-09 00:20  hellozay  阅读(1065)  评论(0编辑  收藏  举报