时间任务调度,咱们必定不会陌生,那么今天就来看看JDK中的时间任务调度工具Timer;java
什么是定时任务调度:
基于给定的时间点,给定的时间间隔或者给定的执行次数 自动执行的任务;并发
Timer简介: 有且仅有 一个后台线程 对 多个业务线程 进行 定时定频率的调度;ide
关于Timer的测试代码:函数
1, 首先建立任务 MyTimerTask 继承 TimerTask 重写 run():工具
package timer; import java.text.SimpleDateFormat; import java.util.TimerTask; public class MyTimerTask extends TimerTask{ private String name; private int count = 0; public MyTimerTask() {} public MyTimerTask(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { //测试 schedule() 与 scheduleAtFixedRate() 区别: Thread.sleep(3000L); } catch (InterruptedException e) { e.printStackTrace(); } if(count<5){ System.out.println("当前Task名称:" + name + ", 执行时间:" + sf.format(scheduledExecutionTime())); count++; } else { //结束当前任务 cancel(); System.out.println("TimerTask "+name+" is cancel(), count="+count+", 最后执行时间:"+ sf.format(scheduledExecutionTime())); } } }
2, Timer 调用测试:测试
package timer; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; public class MyTimer { public static void main(String[] args) throws InterruptedException { Timer timer = new Timer(); MyTimerTask myTimerTask = new MyTimerTask("NO.1.1"); Calendar calender = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间: " + sf.format(calender.getTime())); // ------------schedule的四种用法---------- /** * 1, schedule(Task,Date time);在时间等于或着超过time的时候执行且执行一次task; */ //calender.add(Calendar.SECOND, 3); // timer.schedule(myTimerTask, calender.getTime()); /** * 2, schedule(task, Date firstTime, long period); 参数说明: task: 执行任务, * firstTime: 首次执行时间, period: 执行时间间隔(毫秒) 做用: * 时间等于或超过time时首次执行task,以后每隔period毫秒执行一次task; */ // myTimerTask.setName("NO.1.2"); // timer.schedule(myTimerTask, calender.getTime(), 2000L); /** * 3, schedule(TimerTask task, long delay); 做用: 等待 delay 毫秒后 执行且执行一次 * task */ // myTimerTask.setName("NO.1.3"); // timer.schedule(myTimerTask, 1000L); /** * 4, schedule(TimerTask task, long delay, long period) 做用: 等待 delay毫秒后 * 执行第一次 task,以后没隔 period毫秒执行一次; */ // myTimerTask.setName("NO.1.4"); // timer.schedule(myTimerTask, 2000L, 1000L); // ---------------scheduleAtFixedRate的两种用法--------------- /** * 5, scheduleAtFixedRate(TimerTask task, long delay, long period); 做用: * 与4相同; */ // myTimerTask.setName("NO.1.5"); // timer.scheduleAtFixedRate(myTimerTask, 2000L, 1000L); /** * 6, scheduleAtFixedRate(TimerTask task, Date firstTime, long period); * 做用: 与2相同; */ // myTimerTask.setName("NO.1.6"); // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 2000L); // ---------------------------其余函数用法------------------------------------ /** * 7, cancel(); 做用: 终止此计时器,丢弃全部当前已安排的任务; */ // MyTimerTask myTimerTask2 = new MyTimerTask("NO.2.1"); // timer.scheduleAtFixedRate(myTimerTask2, calender.getTime(), 2000L); // Thread.sleep(5000L); // timer.cancel(); // System.out.println("timer is cancel()"); /** * 8, purge(); 做用: 今后计时器的任务队列中移除全部已取消的任务,并返回从队列中移除的任务数; */ // myTimerTask2.cancel(); // int number = timer.purge(); // System.out.println("timer is purge() number=" + number); // ---------schedule 和 scheduleAtFixedRate的区别:------------- /* 1, 首次计划执行的时间早于当前的时间时; */ //设置开始执行时间为当前时间六秒前 // calender.add(Calendar.SECOND, -6); /** * 9, schedule(); * "fixed-delay", 若是第一次执行时间被delay了,随后的执行时间按照上一次实际执行的时间点进行计算; */ // timer.schedule(myTimerTask, calender.getTime(), 1000L); /** * 10, scheduleAtFixedRate(); * "fixed-rate",若是第一次执行时间被delay了,随后执行时间按照上一次开始时间点进行计算, * 而且为了遇上进度会屡次执行任务,所以TimerTask中的执行体须要考虑同步; */ // timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L); /* 2, 任务执行所需时间超出任务的执行周期间隔时; */ /** * 11, schedule(); * 下次执行时间相对上次实际执行完成的时间点,所以执行时间会不断延后 * */ // timer.schedule(myTimerTask, calender.getTime(), 1000L); /** * 12, scheduleAtFixedRate(); * 下次执行时间相对上次实际执行开始的时间点,所以执行时间不会延后,存在并发性; * */ timer.scheduleAtFixedRate(myTimerTask, calender.getTime(), 1000L); //------------------Timer的缺陷及使用禁区---------------------- /** * 天生的两种缺陷: * 1, 管理并发任务的缺陷; * Timer有且仅有一个线程去执行定时任务,若是存在多个任务,且任务时间过长,会致使执行效果与预期不符; * * 2, 当任务抛出异常时的缺陷; * 若是TimerTask抛出RuntimeException, Timer会中止全部的任务运行; * * 使用禁区: * 1, 对时效性要求较高的多任务并发做业; * * 2, 对复杂任务的调度; * */ } }