当前位置:   article > 正文

定时任务,ScheduledExecutorService_executorservice.schedule

executorservice.schedule

工作里面涉及到创建定时删除任务,使用到了ScheduledExecutorService,现在做一个简单的使用总结。

ScheduledExecutorService可以实现任务的循环执行,可以当做一个简单的定时任务组件,因有线程池的特性,因此可以多任务之间线程并发执行,不影响主线程业务。任务来的时候,才会真正的创建线程去执行。

几个方法:

1、schedule 方法

  1. // 创建一个延迟任务,只会执行一次
  2. // 参数1:任务
  3. // 参数2:方法第一次执行的延迟时间
  4. // 参数3:延迟单位
  5. public ScheduledFuture<?> schedule(Runnable command,
  6. long delay, TimeUnit unit);

 任务只会执行一次。

  1. public void initSchedule() {
  2. executorService.schedule(() -> {
  3. try {
  4. System.out.println("开始执行schedule,时间:" + format.format(new Date()));
  5. Thread.sleep(1000);
  6. System.out.println("结束执行schedule,时间:" + format.format(new Date()));
  7. } catch (Exception e) {
  8. System.out.println("执行schedule异常" + format.format(new Date()));
  9. }
  10. }, 2, TimeUnit.SECONDS);
  11. executorService.shutdown();
  12. }

2、scheduleAtFixedRate 方法

循环执行的任务。上一个任务开始的时间开始计时,假设定义period时间为2s,那么第一个任务开始2s后,检测上一个任务是否执行完毕:

        如果执行完毕,则立刻执行下一个任务

        如果没有执行完毕,则等待上一个任务执行完,立刻执行

因此,此方法不能严格保证任务一定按照时间间隔去执行。

  1. // 参数1:任务
  2. // 参数2:初始化完成后延迟多长时间执行第一次任务
  3. // 参数3:任务时间间隔
  4. // 参数4:单位
  5. public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
  6. long initialDelay,
  7. long period,
  8. TimeUnit unit);
  1. public void initScheduleAtFixedRate() {
  2. executorService.scheduleAtFixedRate(() -> {
  3. try {
  4. System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  5. Thread.sleep(3000);
  6. System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  7. } catch (Exception e) {
  8. System.out.println("执行ScheduleAtFixedRate异常" + format.format(new Date()));
  9. }
  10. }, 0, 2, TimeUnit.SECONDS);
  11. }
  12. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:015
  13. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:018
  14. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:018
  15. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:021
  16. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:021
  17. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:024

注意,如果没有try catch住,出现异常了,那么后续定时任务就无法继续执行了。

  1. public void initScheduleAtFixedRate1() {
  2. executorService.scheduleAtFixedRate(() -> {
  3. System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  4. int a = 1/0;
  5. System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  6. }, 0, 2, TimeUnit.SECONDS);
  7. }
  8. //一直被卡着,无法执行后续任务
  9. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:18:038

3、initScheduleWithFixedDelay方法

循环执行的任务。以上一次任务执行时间为准,加上任务时间间隔作为下一次任务开始的时间。

  1. public void initScheduleWithFixedDelay() {
  2. executorService.scheduleWithFixedDelay(() -> {
  3. try {
  4. System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  5. Thread.sleep(3000);
  6. System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  7. } catch (Exception e) {
  8. System.out.println("执行ScheduleAtFixedRate异常" + format.format(new Date()));
  9. }
  10. }, 0, 2, TimeUnit.SECONDS);
  11. }
  12. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:026
  13. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:029
  14. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:031
  15. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:034
  16. 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:036
  17. 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:039

注意,如果没有try catch住,出现异常了,那么后续定时任务就无法继续执行了。

  1. public void initScheduleWithFixedDelay1() {
  2. executorService.scheduleWithFixedDelay(() -> {
  3. System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  4. int a = 1 / 0;
  5. System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
  6. }, 0, 2, TimeUnit.SECONDS);
  7. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/83722
推荐阅读
  

闽ICP备14008679号