Timer
详情请见:
https://blog.youkuaiyun.com/xianpinjin4752/article/details/80033379
简单使用看例子:
package com.demo;
import javax.naming.Name;
import java.util.Date;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest {
public static void main(String[] args) {
//创建计时任务,实现线程接口Runnable
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "运行结束。");
}
};
//创建计时器
Timer timer = new Timer("timer-task");
//5000毫秒以后执行
timer.schedule(timerTask, 5000);
//用Date来指定执行时间,1小时后
timer.schedule(timerTask, new Date(System.currentTimeMillis()+1*60*60*1000));
//5000毫秒后开始执行,之后每3000毫秒执行一次
timer.schedule(timerTask, 5000, 3000);
//用Date来指定执行时间,1小时后,每3000毫秒执行一次
timer.schedule(timerTask, new Date(System.currentTimeMillis()+1*60*60*1000), 3000);
//timer.scheduleAtFixedRate(),任务拖延后,把前面欠的都会补上
}
}
ScheduledExecutorService
ScheduledExecutorService是一个线程池,却有实现定时循环和延迟任务的特性。
因为Timer内部是单线程实现,一旦报错就会停止循环任务。所以会常用ScheduledExecutorService来定时循环任务。一来是多线程实现循环任务,防止报错中断其他线程;二来是直接用线程实现任务实例,方便编程。
详情参考:
https://blog.youkuaiyun.com/ma969070578/article/details/82863477
简单了解应用,例子:
package com.demo;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorTest {
public static void main(String[] args) {
// 创建定时任务
Runnable thread = new Runnable() {
@Override
public void run() {
System.out.println("time task running. ");
}
};
// 1、获得scheduledExecutorService实例,下边是创建单线程,newScheduledThreadPool是创建线程池。
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
// 2、定时一次性任务,5秒后执行
scheduledExecutorService.schedule(thread, 5, TimeUnit.SECONDS);
//定时循环任务,5秒后,每3秒循环一次,下面是一任务开始时间计算,scheduleWithFixedDelay是任务结束后开始计算周期时间(3秒)
scheduledExecutorService.scheduleAtFixedRate(thread, 5, 3, TimeUnit.SECONDS);
}
}