java 定时任务的几种实现方式

时间:2022-11-13 07:50:09
引言 在一个项目中往往需要定时或者在特定的时间执行一些任务,如删除服务器存储的一些数据缓存,定时发送推送等等。实现定时任务的方式有好几种,我总结了我知道的几种实现方式,具体实现方式如下: 实现一、使用Thread等待的方式
public static class TimerThread extends  Thread{
@Override
public void run() {
super.run();
while (true){
doSomething();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void doSomething() {
}
}


实现二、timer的方式
static {
Timer timer = new Timer();
//一秒后执行,没五秒执行一次
timer.schedule(new ImpTwoTimerTask(),1000,5000);
}
public static class ImpTwoTimerTask extends TimerTask {
@Override
public void run() {
doSomething();
}
}


实现三、Executors 的方式实现
public  static final ScheduledExecutorService _service = Executors.newSingleThreadScheduledExecutor();
static {
//一秒后执行,每五秒执行一次
_service.scheduleAtFixedRate(new ImpThreeExecutorRunnable(), 1000, 5000, TimeUnit.MICROSECONDS);
}
public static class ImpThreeExecutorRunnable implements Runnable{
@Override
public void run() {
doSomething();
}
}


实现四、spring的@Scheduled 实现 1、xml配置 <task:anootation-driven> 2、接口和其实现类 注:该功能只能在接口的实现类上定义,在一般的类上定义无效果,在接口上定义也没有效果 @Scheduled(fixedRate=8000) @Scheduled(fixedDelay=8000) fixedRate 和fixdDelay的区别 fixedRate:如果该方法需要执行8秒,第一次开始执行和第二次开始执行间隔16秒 fixdDelay:如果该方法需要执行8秒,第一次开始执行和第二次开始执行间隔也是8秒 如果想更精确的执行定时任务可以使用 @Scheduled(cron) corn由七个或者6个字符组成,中间使用空格作为分割符 分别为:second minute hour dayOfMonth MonthOfYear DayOfWeek Year corn的具体写法大家可以自行百度
@Component
public class Task implements ITask {
//每八秒执行一次
@Scheduled(fixedRate = 8000)
@Override
public void ScheduledTest() {
doSomething();
}
}


总结 以上的四种实现定时任务的方式一般情况下都可以使用,但是在要求精确小时分钟或者天,那就推荐使用Spring的实现方式,比如服务器需要在每天的凌晨两点做数据的清除。如果任务需要每半个小时必须执行一次(不管任务执行多久就算任务没有执行完也要执行下一次任务),推荐使用Executors(有scheduleWithFixedDelay 和scheduleAtFixedRate,概念跟Spring的fixedRate、fixdDelay 一致)和 Spring的实现方式。