赞
踩
工作里面涉及到创建定时删除任务,使用到了ScheduledExecutorService,现在做一个简单的使用总结。
ScheduledExecutorService可以实现任务的循环执行,可以当做一个简单的定时任务组件,因有线程池的特性,因此可以多任务之间线程并发执行,不影响主线程业务。任务来的时候,才会真正的创建线程去执行。
几个方法:
1、schedule 方法
- // 创建一个延迟任务,只会执行一次
- // 参数1:任务
- // 参数2:方法第一次执行的延迟时间
- // 参数3:延迟单位
- public ScheduledFuture<?> schedule(Runnable command,
- long delay, TimeUnit unit);
任务只会执行一次。
- public void initSchedule() {
- executorService.schedule(() -> {
- try {
- System.out.println("开始执行schedule,时间:" + format.format(new Date()));
- Thread.sleep(1000);
- System.out.println("结束执行schedule,时间:" + format.format(new Date()));
- } catch (Exception e) {
- System.out.println("执行schedule异常" + format.format(new Date()));
- }
- }, 2, TimeUnit.SECONDS);
-
- executorService.shutdown();
- }
2、scheduleAtFixedRate 方法
循环执行的任务。上一个任务开始的时间开始计时,假设定义period时间为2s,那么第一个任务开始2s后,检测上一个任务是否执行完毕:
如果执行完毕,则立刻执行下一个任务
如果没有执行完毕,则等待上一个任务执行完,立刻执行
因此,此方法不能严格保证任务一定按照时间间隔去执行。
- // 参数1:任务
- // 参数2:初始化完成后延迟多长时间执行第一次任务
- // 参数3:任务时间间隔
- // 参数4:单位
- public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
- long initialDelay,
- long period,
- TimeUnit unit);
- public void initScheduleAtFixedRate() {
- executorService.scheduleAtFixedRate(() -> {
- try {
- System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- Thread.sleep(3000);
- System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- } catch (Exception e) {
- System.out.println("执行ScheduleAtFixedRate异常" + format.format(new Date()));
- }
- }, 0, 2, TimeUnit.SECONDS);
- }
-
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:015
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:018
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:018
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:021
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:10:021
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:10:024
注意,如果没有try catch住,出现异常了,那么后续定时任务就无法继续执行了。
- public void initScheduleAtFixedRate1() {
- executorService.scheduleAtFixedRate(() -> {
- System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- int a = 1/0;
- System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- }, 0, 2, TimeUnit.SECONDS);
- }
-
- //一直被卡着,无法执行后续任务
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:18:038
3、initScheduleWithFixedDelay方法
循环执行的任务。以上一次任务执行时间为准,加上任务时间间隔作为下一次任务开始的时间。
- public void initScheduleWithFixedDelay() {
- executorService.scheduleWithFixedDelay(() -> {
- try {
- System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- Thread.sleep(3000);
- System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- } catch (Exception e) {
- System.out.println("执行ScheduleAtFixedRate异常" + format.format(new Date()));
- }
- }, 0, 2, TimeUnit.SECONDS);
- }
-
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:026
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:029
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:031
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:034
- 开始执行ScheduleAtFixedRate,时间:2023-03-23 17:11:036
- 结束执行ScheduleAtFixedRate,时间:2023-03-23 17:11:039
注意,如果没有try catch住,出现异常了,那么后续定时任务就无法继续执行了。
- public void initScheduleWithFixedDelay1() {
- executorService.scheduleWithFixedDelay(() -> {
-
- System.out.println("开始执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
- int a = 1 / 0;
- System.out.println("结束执行ScheduleAtFixedRate,时间:" + format.format(new Date()));
-
- }, 0, 2, TimeUnit.SECONDS);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。