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。 public void schedule(TimerTask task, long delay); // 在指定时间time执行任务task,如果时间已过,就立即执行。 public void schedule(TimerTask task, Date time); // 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次,任务执行的开始时间受上次执行任务所耗的时间影响。 public void schedule(TimerTask task, long delay, long period); // 在指定的时间firstTime执行第一次任务,之后每过period毫秒执行一次,任务执行的开始时间受上次执行任务所耗的时间影响。
// 如果首次执行任务的时间已过,则立即执行。 public void schedule(TimerTask task, Date firstTime, long period);
// 延迟delay毫秒后执行第一次任务,之后每过period毫秒执行一次。 public void scheduleAtFixedRate(TimerTask task, long delay, long period);
// 在指定的时间firstTime执行第一次任务,之后每过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"); exeTime = System.currentTimeMillis(); try { Thread.sleep(3000); } catch (InterruptedException e) {} } }, 1000, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 01:22:59 -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:23:00 ****实际执行任务的时间:2019-05-28 01:23:00 ****距离上次执行任务的时间间隔:1001ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:23:03 ****实际执行任务的时间:2019-05-28 01:23:03 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:23:06 ****实际执行任务的时间:2019-05-28 01:23:06 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(3):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:23:09 ****实际执行任务的时间:2019-05-28 01:23:09 ****距离上次执行任务的时间间隔:3001ms
扫描二维码关注公众号,回复:
6289442 查看本文章
示例四:定时+周期性执行任务
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"); exeTime = System.currentTimeMillis(); try { Thread.sleep(3000); } catch (InterruptedException e) {} } }, planExecuteTime, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 01:24:19 -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:24:19 ****实际执行任务的时间:2019-05-28 01:24:19 ****距离上次执行任务的时间间隔:1ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:24:22 ****实际执行任务的时间:2019-05-28 01:24:22 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:24:25 ****实际执行任务的时间:2019-05-28 01:24:25 ****距离上次执行任务的时间间隔:3000ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:24:28 ****实际执行任务的时间:2019-05-28 01:24:28 ****距离上次执行任务的时间间隔:3001ms
示例五:延迟+周期性执行任务
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"); exeTime = System.currentTimeMillis(); try { Thread.sleep(3000); } catch (InterruptedException e) {} } }, 1000, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 01:28:15 -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:28:16 ****实际执行任务的时间:2019-05-28 01:28:16 ****距离上次执行任务的时间间隔:1023ms -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:28:18 ****实际执行任务的时间:2019-05-28 01:28:19 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(5):【延迟1秒执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 01:28:20 ****实际执行任务的时间:2019-05-28 01:28:22 ****距离上次执行任务的时间间隔:3000ms
示例六:定时+周期性执行任务
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("计划任务(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"); exeTime = System.currentTimeMillis(); try { Thread.sleep(3000); } catch (InterruptedException e) {} } }, planExecuteTime, 2000); } }
执行结果如下:
安排执行任务的时间:2019-05-28 01:29:57 -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 00:23:00 ****实际执行任务的时间:2019-05-28 01:29:57 ****距离上次执行任务的时间间隔:0ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 00:23:02 ****实际执行任务的时间:2019-05-28 01:30:00 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 00:23:04 ****实际执行任务的时间:2019-05-28 01:30:03 ****距离上次执行任务的时间间隔:3001ms -------------------------------------------------------------------------------- 计划任务(4):【于2019-05-28 00:23:00执行第一次任务,之后每过2秒执行一次任务】 ****预期执行任务的时间:2019-05-28 00:23:06 ****实际执行任务的时间:2019-05-28 01:30:06 ****距离上次执行任务的时间间隔:3000ms