ScheduledExecutorService
程序员文章站
2022-05-14 21:56:06
...
ScheduledExecutorService,我平时没有用过,他的最大优点除了线程池的特性以外,可以实现循环或延迟任务。
ScheduledExecutorService 和 Timer 的区别
Timer的内部只有一个线程,如果有多个任务的话就会顺序执行,这样我们的延迟时间和循环时间就会出现问题。
ScheduledExecutorService是线程池,所以就不会出现这个情况,在对延迟任务和循环任务要求严格的时候,就需要考虑使用ScheduledExecutorService了。
- scheduleAtFixedRate:延时设定时间(initialDelay)后执行第一次任务,每隔时间间隔(period)再次执行任务。
- schedule:延时设定时间(initialDelay)后只执行一次任务。
- scheduleWithFixedDelay:延时设定时间(initialDelay)后执行第一次任务,随后每次任务执行完后延迟设定时间(delay)再次执行任务。
附:代码
1.Main.java
@Slf4j
@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);
}
}
@Slf4j
@Service
public class TaskService implements Runnable {
@Override
public void run() {
// 定时任务业务逻辑
log.info("taskService run!!");
}
}
#server:
# port: 9116
spring:
main:
web-application-type: none
task:
time_clear_sector: "18:00:00"
链接
https://blog.csdn.net/weixin_39792935/article/details/105357000
https://blog.csdn.net/ma969070578/article/details/82863477
推荐阅读
-
ScheduledExecutorService调度线程池运行几次后停止某一个线程
-
Timer和ScheduledExecutorService区别
-
Java:转载—— ScheduledExecutorService执行周期性或定时任务
-
ScheduledExecutorService执行周期性或定时任务
-
<线程池-定时任务> ScheduledExecutorService之shutdown引发的RejectedExecutionException问题
-
ScheduledExecutorService的scheduleAtFixedRate和scheduleWithFixedDelay方法的区别
-
ScheduledExecutorService
-
ScheduledExecutorService
-
java ScheduledExecutorService(定时)接口
-
ScheduledExecutorService