Thread 实现定时任务
public static void threadTask() {
new Thread(() -> {
while (true) {
try {
System.out.println("doSomething");
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}).start();
}
Timer 类实现定时任务
public static void timerTask() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
log.info("doSomething1");
}
}, 2000, 1000);
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2023-03-02 10:24:00");
timer.schedule(new TimerTask() {
@Override
public void run() {
log.info("doSomething1");
}
}, date);
}
- Timer 类对象被创建出来后就会启动一个线程,调用该对象的 schedule 方法就是利用该线程进行一些定时任务的操作
- Timer 类对象是单线程执行任务,其中一个任务执行时间比较长会影响到其他任务
- 某个 TimerTask 抛出异常,Timer 会停止线程,导致所有任务停止运行
- schedule 有以下六种使用方式
schedule(TimerTask task, Date time);
schedule(TimerTask task, long delay);
schedule(TimerTask task, Date firstTime,long period);
schedule(TimerTask task, long delay, long period);
scheduleAtFixedRate(TimerTask task,Date firstTime,long period);
scheduleAtFixedRate(TimerTask task, long delay, long period);
ScheduledExecutorService 类实现定时任务
- JDK 1.5 引入的新的定时任务类;基于线程池,设计的初衷就是解决 Timer 类的单线程执行问题;并且每个线程间不会相互影响
public static void ScheduledExecutorServiceTask() {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(5);
ses.scheduleAtFixedRate(() -> {
System.out.println("doSomething");
}, 1000, 1000, TimeUnit.MILLISECONDS);
}
- ScheduledExecutorService 有以下四种使用方式(整体和 Timer 差别不大)
schedule(Runnable command, long delay, TimeUnit unit);
schedule(Callable<V> callable, long delay, TimeUnit unit);
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);
Spring 封装的定时任务使用
@EnableScheduling
@Component
@Slf4j
public class SpringTask {
@Scheduled(cron = "${sue.spring.task.cron}")
public void task() {
log.info("doSomething");
}
}
- Springboot 内部使用的就是 ScheduledExecutorService ,corn 以执行开始时间判断间隔,还有其他方式使用时在进行了解
- Spring 默认创建线程数为 1 的线程池,可以通过配置文件进行调整
spring:
task:
scheduling:
thread-name-prefix: scheduling-
pool:
size: 5