ScheduledThreadPool 源码解析——定时类线程池是如何工作的


引言

之前的文章《线程池源码分析》,详细介绍了线程池的原理。

这篇在此基础上聊聊 定时类的线程池 ScheduledThreadPool

假定线程池那篇你已经看过了哈!

项目中,经常会用到定时任务,

比如基于注解的 @Scheduled,配合 cron 表达式。

那源码级别,若要使用定时任务,不大可能再集成 spring 框架来实现

比如 Eureka 的心跳机制,典型的定时任务,

它的实现就是应用的 定时类线程池,

也就是今天所说的 ScheduledThreadPool

今天详细剖析下它的源码及使用。


一、ScheduledThreadPool 使用示例

1. 延时类的定时任务 schedule


   public static void main(String[] args) throws Exception {
   
   
       ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
       long start = System.currentTimeMillis();
       log.info("延迟的 定时任务执,开始时间:{}", start);
       scheduledExecutorService.schedule(new Runnable() {
   
   
           @Override
           public void run() {
   
   
               long running = System.currentTimeMillis();
               log.info(" 执行任务,时间:{}", running);
               log.info("相隔毫秒数:{}", running - start);
           }
       },3, TimeUnit.SECONDS);
       scheduledExecutorService.shutdown();
   }

这个示例,任务提交后,不是立马执行。按指定的延迟时间,过了这个时间再执行。

比如示例中,任务提交后,延迟3秒再执行。
在这里插入图片描述

2. 延时类,固定周期执行任务 scheduleAtFixedRate


  public static void main(String[] args) throws Exception {
   
   
      ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
      long start = System.currentTimeMillis();
      log.info("延迟类固定周期任务,开始时间:{}", start);
      scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
   
   
          @SneakyThrows
          @Override
          public void run() {
   
   
              long running = System.currentTimeMillis();
              long dif = running - start;
              log.info("与任务提交时间,相隔毫秒数:{}", dif);
              if(dif > 20*1000){
   
   
                  scheduledExecutorService.shutdown();
                  log.info("延迟类固定周期任务 end");
              }
              Thread.sleep(1000);

          }
      },5, 2,  TimeUnit.SECONDS);
  }

这个示例是,任务提交5秒之后,才开始执行。之后每隔 2 秒,周期性执行。(每次任务执行时间耗时1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值