0
点赞
收藏
分享

微信扫一扫

Java定时任务整理(亲测)


这里简单总结以下三种基本的定时任务的使用:

  1. JDK提供的定时操作
  2. Quartz轻量级框架
  3. 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定时任务专栏


举报

相关推荐

0 条评论