1、背景
/**
* 异步操作任务调度线程池
*/
private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
public void execute(TimerTask task)
{
executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
}
最近遇见一段代码,不太懂里面的意思,于是抽时间研究了一下。
2、对ScheduledExecutorService的研究
2.1、创建线程池,通过线程池的方式来执行任务
// private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
2.2、第一次执行任务的延时时间(initialDelay),周期执行的时间间隔(period)
以下的内容从JDK中粘贴翻译
// schedule:延时设定时间(initialDelay)后只执行一次任务。
public ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
// schedule:延时设定时间(initialDelay)后只执行一次任务。
public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);
//延时设定时间(initialDelay)后执行第一次任务,每隔时间间隔(period)再次执行任务。
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period, TimeUnit unit);
//延时设定时间(initialDelay)后执行第一次任务,随后每次任务执行完后延迟设定时间(delay)再次执行任务。
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit);
3、样例
Main.java
@Component
public class Main implements ApplicationRunner {
public static final ThreadLocal<SimpleDateFormat> FORMAT = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public static final ThreadLocal<SimpleDateFormat> FORMAT_DAY = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
private ScheduledExecutorService scheduledExecutorService; //定时任务线程池
@Value("${task.time_clear_sector}")
private String time_clear_sector; //任务执行时间
@Resource
private TaskService taskService; //定时任务
@PostConstruct
public void init() {
// 创建线程池
// scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService = Executors.newScheduledThreadPool(10);
}
@Override
public void run(ApplicationArguments args) {
for (int i = 0; i < 10; i++) {
System.out.println("Run!!");
}
long initialDelay = 12 * 60 * 60L; //定时任务延时启动
long period = 24 * 60 * 60L; //定时任务时间间隔
// 项目启动后,计算定时任务延时的启动时间
long currentTimeMillis = System.currentTimeMillis();
String taskTime = FORMAT_DAY.get().format(currentTimeMillis) + " " + time_clear_sector;
try {
long taskTimestamp = FORMAT.get().parse(taskTime).getTime();
initialDelay = (taskTimestamp - currentTimeMillis) > 0 ? (taskTimestamp - currentTimeMillis) / 1000 : 1;
} catch (ParseException e) {
e.printStackTrace();
}
// 定时任务启动(延时时间后周期执行)
scheduledExecutorService.scheduleAtFixedRate(taskService, initialDelay, period, TimeUnit.SECONDS);
}
}
TaskService.java
@Slf4j
@Service
public class TaskService implements Runnable {
@Override
public void run() {
// 定时任务业务逻辑
log.info("taskService run!!");
}
}
application.yml
#server:
# port: 9116
spring:
main:
web-application-type: none
task:
time_clear_sector: "18:00:00"
4、结束
一个人走的快,一群人走的远,一起学习,一起进步。