这里简单总结以下三种基本的定时任务的使用:
- JDK提供的定时操作
- Quartz轻量级框架
- Spring提供的定时操作
说明:这里测试采用JDK8,只做简单使用总结。
一、 JDK提供的定时操作
JDK自带的Timer类,以及JDK1.5+ 新增的ScheduledExecutorService接口的实现类ScheduledThreadPoolExecutor。
1. Timer类
使用jdk提供的Timer类,此类是线程安全的,多个线程可以共享单个Timer对象而无需进行外部同步。
注:构造方法、常用方法请查询相关API。
void cancel() ; //终止此计时器,丢弃所有当前已安排的任务。
【例】:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public static void main(String[] args) throws ParseException {
/**
* 定时任务一:延迟0.5s启动,每隔1s执行一次
* (等任务结束再开始计算时间间隔,即下次任务执行开始时间为:上次任务执行所用时间+间隔时间)
*/
new Timer("testTimer1").schedule(new TimerTask() {//testTimer1为线程名称
@Override
public void run() {
System.out.println("当前时间:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}, 500, 1000);//单位:毫秒
/**
* 定时任务二:指定日期时间启动,每隔1s执行一次
* (每间隔1秒执行一次,不管上次任务执行情况,有并发情况)
*/
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2019-11-10 11:11:00");
new Timer("testTimer2").scheduleAtFixedRate(new TimerTask() {//testTimer2为线程名称
@Override
public void run() {
System.out.println("当前时间:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}, date, 1000);//单位:毫秒
}
2. ScheduledThreadPoolExecutor类
注:构造方法、常用方法请查询相关API。
【例】:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public static void main(String[] args) throws ParseException {
/**
* 定时任务一:延迟1s启动,仅执行一次
*/
ScheduledExecutorService scheduledExecutorService1 = Executors.newScheduledThreadPool(10);
scheduledExecutorService1.schedule(new Runnable() {
@Override
public void run() {
System.out.println("当前时间:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
},1, TimeUnit.SECONDS);
/**
* 定时任务二:延迟1s启动,每隔1s执行一次,是前一个任务开始时就开始计算时间间隔,但是会等上一个任务结束在开始下一个
*/
ScheduledExecutorService scheduledExecutorService2 = Executors.newScheduledThreadPool(10);
scheduledExecutorService2.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("当前时间:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}, 1, 1, TimeUnit.SECONDS);
/**
* 定时任务三:延迟1s启动,在前一个任务执行完成之后,延迟1s再执行
*/
ScheduledExecutorService scheduledExecutorService3 = Executors.newScheduledThreadPool(10);
scheduledExecutorService3.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("当前时间:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
}, 1, 1, TimeUnit.SECONDS);
}
二、 Quartz
链接到Quartz专栏
三、Spring3.0以后自带的task
链接到spring定时任务专栏