Java多线程-定时器Timer的使用
方法 schedule(TimerTask task, Date time)
该方法的作用是在指定的日期执行一次某一任务。
注意:
TimerTask 是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟。
示例:
public class Test { private static Timer timer = new Timer(); static class MyTask extends TimerTask { @Override public void run() { System.out.println("运行了!时间为:" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); } } public static void main(String[] args) throws ParseException { MyTask task = new MyTask(); Date date = DateUtils.parseDate("2020-03-25 14:01:00", "yyyy-MM-dd HH:mm:ss"); timer.schedule(task, date); } }
运行结果如下:
方法 schedule(TimerTask task, Date firstTime, long period)
该方法的作用是在指定的日期之后,按指定的间隔周期性的无限循环地执行某一任务。
TimerTask类的 cancel() 方法
该方法的作用是将自身从任务队列中清除。
注意:
cancel() 方法有时不一定会停止执行计划任务,而是正常执行。原因是因为 cancal() 方法没有竞争到 queue 的锁,所以未能执行清除队列的操作导致的。
示例:
public class Test { private static Timer timer = new Timer(); static class MyTaskA extends TimerTask { @Override public void run() { System.out.println("A运行了!时间为:" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); this.cancel(); } } static class MyTaskB extends TimerTask { @Override public void run() { System.out.println("B运行了!时间为:" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss")); } } public static void main(String[] args) throws ParseException { MyTaskA taskA = new MyTaskA(); MyTaskB taskB = new MyTaskB(); Date date = DateUtils.parseDate("2020-03-25 14:16:30", "yyyy-MM-dd HH:mm:ss"); timer.schedule(taskA, date, 2000); timer.schedule(taskB, date, 2000); } }
运行结果如图: