定时任务-Timer
Timer类的全限定名
java.util.Timer
java.util.Timer类的构造函数
public Timer(); public Timer(boolean isDaemon); public Timer(String name); public Timer(String name, boolean isDaemon);
java.util.Timer类提供的创建定时任务的方法
/** * 延迟delay毫秒后执行任务task。 * * @param task 任务 * @param delay 延迟时间 */ public void schedule(TimerTask task, long delay); /** * 在指定时间time执行任务task,如果时间已过,就立即执行。 * * @param task 任务 * @param time 计划执行任务的时间 */ public void schedule(TimerTask task, Date time); /** * 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次。 * * 假设: * 执行一次任务需要消耗的时间为 exeTime * 执行此次任务的开始时间是 nowTime * 执行下一次任务的预期时间是 expectTime * 执行下一次任务的实际时间是 actuallyTime * 如果 exeTime >= period ,那么,expectTime == nowTime + exeTime; actuallyTime >= expectTime; * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= expectTime; * * @param task 任务 * @param delay 执行首次任务的延迟时间 * @param period 后续周期性执行任务的时间间隔 */ public void schedule(TimerTask task, long delay, long period); /** * 在指定的时间firstTime执行第一次任务,之后每过period毫秒执行一次。 * * 如果首次执行任务的时间firstTime已过,则立即执行一次首次任务。 * * 假设: * 执行一次任务需要消耗的时间为 exeTime * 执行此次任务的开始时间是 nowTime * 执行下一次任务的预期时间是 expectTime * 执行下一次任务的实际时间是 actuallyTime * 如果 exeTime >= period ,那么,expectTime == nowTime + exeTime; actuallyTime >= nowTime + exeTime; * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period; * * @param task 任务 * @param firstTime 计划执行首次任务的时间 * @param period 后续周期性执行任务的时间间隔 */ public void schedule(TimerTask task, Date firstTime, long period); /** * 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次。 * * 假设: * 执行一次任务需要消耗的时间为 exeTime * 执行此次任务的开始时间是 nowTime * 执行下一次任务的预期时间是 expectTime * 执行下一次任务的实际时间是 actuallyTime * 如果 exeTime >= period ,那么,expectTime == nowTime + period; actuallyTime >= nowTime + exeTime; * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period; * * @param task 任务 * @param delay 执行首次任务的延迟时间 * @param period 后续周期性执行任务的时间间隔 */ public void scheduleAtFixedRate(TimerTask task, long delay, long period); /** * 在指定的时间firstTime执行第一次任务,之后每过period毫秒执行一次。 * * 如果首次执行任务的时间已过,则立即执行之前应当执行的所有任务(1+N)。 * * 假设: * 执行一次任务需要消耗的时间为 exeTime * 执行此次任务的开始时间是 nowTime * 执行下一次任务的预期时间是 expectTime * 执行下一次任务的实际时间是 actuallyTime * 如果 exeTime >= period ,那么,expectTime == nowTime + period; actuallyTime >= nowTime + exeTime; * 如果 exeTime < period , 那么,expectTime == nowTime + period; actuallyTime >= nowTime + period; * * @param task 任务 * @param firstTime 计划执行首次任务的时间 * @param period 后续周期性执行任务的时间间隔 */ public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period);
创建定时任务的示例
示例一:延迟执行任务
package com.java.scheduled.task.timer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo01 { public static void main(String[] args) { Timer timer = new Timer("timer01"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long c1 = System.currentTimeMillis(); timer.schedule(new TimerTask() { @Override public void run() { Date nowDate = new Date(); System.out.println("--------------------------------------------------------------------------------"); long delayTime = nowDate.getTime() - c1; System.out.println("计划任务(1):【延迟2秒执行】"); System.out.println("实际执行任务的时间:"+sdf.format(nowDate)+",延迟时间:"+delayTime +"ms"); } } , 2000); } }
执行结果如下:
-------------------------------------------------------------------------------- 计划任务(1):【延迟2秒执行】 实际执行任务的时间:2019-05-28 01:14:13,延迟时间:2000ms
示例二:在指定时间执行任务
package com.java.scheduled.task.timer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo02 { public static void main(String[] args) { Timer timer = new Timer("timer02"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date planExecuteTime = null; try { planExecuteTime = sdf.parse("2019-05-27 23:58:00"); } catch (ParseException pe) { pe.printStackTrace(); } Date date = new Date(); System.out.println("--------------------------------------------------------------------------------"); System.out.println("安排执行任务的时间:"+sdf.format(date)); timer.schedule(new TimerTask() { @Override public void run() { Date nowDate = new Date(); System.out.println("计划任务(2):【于2019-05-27 23:58:00执行任务】"); System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime()))); System.out.println("****实际执行任务的时间:"+sdf.format(nowDate)); } }, planExecuteTime); } }
执行结果如下:
-------------------------------------------------------------------------------- 安排执行任务的时间:2019-05-28 01:20:16 计划任务(2):【于2019-05-27 23:58:00执行任务】 ****预期执行任务的时间:2019-05-27 23:58:00 ****实际执行任务的时间:2019-05-28 01:20:16
示例三:延迟+周期性执行任务
package com.java.scheduled.task.timer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo03 { public static void main(String[] args) { Timer timer = new Timer("timer03"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); long c2 = System.currentTimeMillis(); Date date = new Date(); System.out.println("安排执行任务的时间:"+sdf.format(date)); timer.schedule(new TimerTask() { long exeTime = c2; @Override public void run() { Date nowDate = new Date(); System.out.println("--------------------------------------------------------------------------------"); System.out.println("计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】"); System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime()))); System.out.println("****实际执行任务的时间:"+sdf.format(nowDate)); System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms"); try { Thread.sleep(3000); } catch (InterruptedException e) {} exeTime = nowDate.getTime(); } }, 1000, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 12:21:49 -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:21:50 ****实际执行任务的时间:2019-05-28 12:21:50 ****距离上次执行任务的时间间隔:1000ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:21:53 ****实际执行任务的时间:2019-05-28 12:21:53 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:21:56 ****实际执行任务的时间:2019-05-28 12:21:56 ****距离上次执行任务的时间间隔:3000ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:21:59 ****实际执行任务的时间:2019-05-28 12:21:59 ****距离上次执行任务的时间间隔:3002ms
示例四:定时+周期性执行任务
package com.java.scheduled.task.timer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo04 { public static void main(String[] args) { Timer timer = new Timer("timer04"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date planExecuteTime = null; long c3 = System.currentTimeMillis(); try { planExecuteTime = sdf.parse("2019-05-28 00:23:00"); } catch (ParseException pe) { pe.printStackTrace(); } Date date = new Date(); System.out.println("安排执行任务的时间:"+sdf.format(date)); timer.schedule(new TimerTask() { long exeTime = c3; @Override public void run() { Date nowDate = new Date(); System.out.println("--------------------------------------------------------------------------------"); System.out.println("计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】"); System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime()))); System.out.println("****实际执行任务的时间:"+sdf.format(nowDate)); System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms"); try { Thread.sleep(3000); } catch (InterruptedException e) {} exeTime = nowDate.getTime(); } }, planExecuteTime, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 12:23:17 -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:23:17 ****实际执行任务的时间:2019-05-28 12:23:17 ****距离上次执行任务的时间间隔:4ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:23:20 ****实际执行任务的时间:2019-05-28 12:23:20 ****距离上次执行任务的时间间隔:3002ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:23:23 ****实际执行任务的时间:2019-05-28 12:23:23 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:23:26 ****实际执行任务的时间:2019-05-28 12:23:26 ****距离上次执行任务的时间间隔:3002ms
示例五:延迟+周期性执行任务
package com.java.scheduled.task.timer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo05 { public static void main(String[] args) { Timer timer = new Timer("timer05"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); System.out.println("安排执行任务的时间:"+sdf.format(date)); long c2 = date.getTime(); timer.scheduleAtFixedRate(new TimerTask() { long exeTime = c2; @Override public void run() { Date nowDate = new Date(); System.out.println("--------------------------------------------------------------------------------"); System.out.println("计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】"); System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime()))); System.out.println("****实际执行任务的时间:"+sdf.format(nowDate)); System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms"); try { Thread.sleep(3000); } catch (InterruptedException e) {} exeTime = nowDate.getTime(); } }, 1000, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 12:24:29 -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:24:30 ****实际执行任务的时间:2019-05-28 12:24:30 ****距离上次执行任务的时间间隔:1001ms -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:24:32 ****实际执行任务的时间:2019-05-28 12:24:33 ****距离上次执行任务的时间间隔:3003ms -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:24:34 ****实际执行任务的时间:2019-05-28 12:24:36 ****距离上次执行任务的时间间隔:3002ms -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:24:36 ****实际执行任务的时间:2019-05-28 12:24:39 ****距离上次执行任务的时间间隔:3002ms
示例六:定时+周期性执行任务
package com.java.scheduled.task.timer; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class ScheduledTaskDemo06 { public static void main(String[] args) { Timer timer = new Timer("timer06"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date planExecuteTime = null; try { planExecuteTime = sdf.parse("2019-05-28 00:23:00"); } catch (ParseException pe) { pe.printStackTrace(); } Date date = new Date(); System.out.println("安排执行任务的时间:"+sdf.format(date)); long c3 = date.getTime(); timer.scheduleAtFixedRate(new TimerTask() { long exeTime = c3; @Override public void run() { Date nowDate = new Date(); System.out.println("--------------------------------------------------------------------------------"); System.out.println("计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】"); System.out.println("****预期执行任务的时间:"+sdf.format(new Date(this.scheduledExecutionTime()))); System.out.println("****实际执行任务的时间:"+sdf.format(nowDate)); System.out.println("****距离上次执行任务的时间间隔:"+(nowDate.getTime() - exeTime)+"ms"); try { Thread.sleep(3000); } catch (InterruptedException e) {} exeTime = nowDate.getTime(); } }, planExecuteTime, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 12:32:44 -------------------------------------------------------------------------------- 计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:33:00 ****实际执行任务的时间:2019-05-28 12:33:00 ****距离上次执行任务的时间间隔:15482ms -------------------------------------------------------------------------------- 计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:33:02 ****实际执行任务的时间:2019-05-28 12:33:03 ****距离上次执行任务的时间间隔:3004ms -------------------------------------------------------------------------------- 计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:33:04 ****实际执行任务的时间:2019-05-28 12:33:06 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:33:06 ****实际执行任务的时间:2019-05-28 12:33:09 ****距离上次执行任务的时间间隔:3000ms -------------------------------------------------------------------------------- 计划任务(6):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 12:33:08 ****实际执行任务的时间:2019-05-28 12:33:12 ****距离上次执行任务的时间间隔:3001ms