总结
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则会一口气将这些任务顺序都执行完毕。