Timer简介:
java.util.Timer
一种定时任务调度工具,一个后台的线程,对多个业务线程,定时定频率的调度
Timer(后台线程)->TimerTask(业务线程)
结构:
入门程序:
package com.sssd.timing.timer;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private String name;
public MyTimerTask(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
//task
System.out.println("this class field name is "+name);
}
}
package com.sssd.timing.timer;
import java.util.Timer;
public class MyTimerMain {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask timerTask = new MyTimerTask("NO.1");
//首次执行,在当前时间的1秒以后,之后每隔两秒钟执行一次
timer.schedule(timerTask,1000L,2000L);
}
}
重要Api:
timer.schedule的四种用法:
timer.scheduleAtFixedRate的两种用法:
两种情况:
1.首次计划执行的时间早于当前的时间
schedule:以当前时间为准,执行计划
scheduleAtFixedRate:由于被延后,所以为了赶上进度,会多次执行任务
2.任务执行所需时间超出任务的执行周期间隔
schedule:会按照计划任务成时间为准,执行计划,周期为任务计划完成时间,不断延后
scheduleAtFixedRate:还是以原间隔时间为准,不会延后,但是存在并发性
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private String name;
public MyTimerTask(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
//task
Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
}
}
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
public class MyTimerMain {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask timerTask = new MyTimerTask("NO.1");
//首次执行,在当前时间的1秒以后,之后每隔两秒钟执行一次
//timer.schedule(timerTask,1000L,2000L);
//1.
/* Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点
timer.schedule(timerTask,instance.getTime());*/
//2.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点,间隔时间段
timer.schedule(timerTask,instance.getTime(),2000L);*/
//3.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,间隔时间段
timer.schedule(timerTask,1000L);*/
//4.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.schedule(timerTask,1000L,2000L);*/
//1.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,时间点,间隔时间段
timer.scheduleAtFixedRate(timerTask,instance.getTime(),2000L);*/
//2.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.scheduleAtFixedRate(timerTask,1000L,2000L);*/
}
}
timer.cancel() 终止计时器,丢弃所有当前已安排的任务
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTaskDemo extends TimerTask {
private String name;
public TimerTaskDemo(String name){
this.name = name;
}
public void run() {
System.out.print(Thread.currentThread().getName()+" task name is"+name);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
class TimerTaskMain{
public static void main(String[] args) {
Timer timer = new Timer();
TimerTaskDemo task1 = new TimerTaskDemo("task1");
TimerTaskDemo task2 = new TimerTaskDemo("task2");
timer.schedule(task1,1000L,2000L);
timer.schedule(task2,2000L,1000L);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("准备丢弃正在执行的任务...");
//丢弃所有已安排的任务
timer.cancel();
System.out.println("已丢弃正在执行的任务...");
}
}
timer.purge() 从此计时器的任务队列中移除所有已取消的任务数
public class TimerTaskDemo extends TimerTask {
private String name;
public TimerTaskDemo(String name){
this.name = name;
}
public void run() {
System.out.print(Thread.currentThread().getName()+" task name is "+name);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
class TimerTaskMain{
public static void main(String[] args) {
Timer timer = new Timer();
TimerTaskDemo task1 = new TimerTaskDemo("task1");
TimerTaskDemo task2 = new TimerTaskDemo("task2");
timer.schedule(task1,1000L,2000L);
timer.schedule(task2,2000L,1000L);
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
task1.cancel();
System.out.println("丢弃已经执行完成的任务...,任务名称为"+timer.purge());
}
}
TimerTask cancel 函数用法:
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private String name;
private Integer count = 0;
public MyTimerTask(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
if(count<3){
//task
Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
count++;
}else{
/**
* 退出当前任务
*/
cancel();
System.out.println("the cancel!");
}
}
}
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
public class MyTimerMain {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask timerTask = new MyTimerTask("NO.1");
//首次执行,在当前时间的1秒以后,之后每隔两秒钟执行一次
timer.schedule(timerTask,1000L,2000L);
//1.
/* Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点
timer.schedule(timerTask,instance.getTime());*/
//2.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点,间隔时间段
timer.schedule(timerTask,instance.getTime(),2000L);*/
//3.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,间隔时间段
timer.schedule(timerTask,1000L);*/
//4.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.schedule(timerTask,1000L,2000L);*/
//1.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,时间点,间隔时间段
timer.scheduleAtFixedRate(timerTask,instance.getTime(),2000L);*/
//2.
/* Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.scheduleAtFixedRate(timerTask,1000L,2000L);*/
}
}
TimerTask scheduledExecutionTime函数(返回任务最近实际执行的已安排执行的时间)用法:
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;
public class MyTimerTask extends TimerTask {
private String name;
private Integer count = 0;
public MyTimerTask(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
if(count<3){
//task
Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
count++;
}else{
/**
* 退出当前任务
*/
cancel();
System.out.println("the cancel!");
}
}
}
package com.sssd.timing.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
public class MyTimerMain {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask timerTask = new MyTimerTask("NO.1");
//首次执行,在当前时间的1秒以后,之后每隔两秒钟执行一次
timer.schedule(timerTask,1000L);
//返回任务最近实际执行的已安排执行的时间
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timerTask.scheduledExecutionTime()));
//1.
/* Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点
timer.schedule(timerTask,instance.getTime());*/
//2.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,具体时间点,间隔时间段
timer.schedule(timerTask,instance.getTime(),2000L);*/
//3.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,间隔时间段
timer.schedule(timerTask,1000L);*/
//4.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.schedule(timerTask,1000L,2000L);*/
//1.
/*Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,时间点,间隔时间段
timer.scheduleAtFixedRate(timerTask,instance.getTime(),2000L);*/
//2.
/* Calendar instance = Calendar.getInstance();
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(instance.getTime()));
instance.add(Calendar.SECOND,3);
//业务类对象,当前时间点之后 间隔时间段,间隔时间段
timer.scheduleAtFixedRate(timerTask,1000L,2000L);*/
}
}
Timer函数综合应用
package com.sssd.timing.timer.app;
import java.text.SimpleDateFormat;
import java.util.TimerTask;
//跳舞机器人
public class DancingRobot extends TimerTask {
public void run() {
//打印最近一次的执行时间
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(scheduledExecutionTime()));
//
System.out.println("Dancing...");
}
}
package com.sssd.timing.timer.app;
import java.util.Timer;
import java.util.TimerTask;
//灌水机器人
public class WaterRobot extends TimerTask {
private Timer timer ;
private final Integer MAX_BUCKET_CAPACITY = 5;
private Integer initBucketCapacity = 0;
public WaterRobot(Timer timer){
this.timer = timer;
}
public void run() {
//灌水直至通满为止
if(initBucketCapacity<MAX_BUCKET_CAPACITY){
System.out.println("Add 1L water into the bucket!");
initBucketCapacity++;
}else{
//水满之后就停止执行
cancel();
System.out.println("bucket capacity is "+initBucketCapacity);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
}
}
}
package com.sssd.timing.timer.app;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
//Timer的缺陷
//1.管理并发任务的缺陷
//2.当任务抛出异常的缺陷
public class Executor {
public static void main(String[] args) {
Timer timer = new Timer();
DancingRobot dancingTask = new DancingRobot();
WaterRobot waterTask = new WaterRobot(timer);
System.out.println("current time is "+new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
timer.schedule(dancingTask,new Date(),2000L);
timer.scheduleAtFixedRate(waterTask,new Date(),1000L);
}
}