jdk定时器线程池的使用
ScheduledThreadPoolExecutor
该类实际上是通过ThreadPoolExecutor创建出线程池,通过线程池来处理定时器类任务,可以并行处理各个定时器的任务,互相之间不会受到影响,适用于对于时间精度要严格要求的任务。
-
初始化
// 父类指向具体的实现,第一个参数为线程池活跃线程数量 ScheduleExecutorService service = new ScheduledThreadPoolExecutor(2);
-
使用
-
延时启动任务
// 延时20s后打印当前系统时间戳 service.schedule(() -> { String s = new Timestamp(System.currentTimeMillis()).toString(); System.out.println(s); }, 20, TimeUnit.SECONDS);
-
周期型执行任务
scheduleAtFixedRate周期计算方式:当前任务开始的时间——下个任务开始时间,如果上个任务的执行时间超过了周期频率时间,则会推迟下个任务的开始时间
// 第一个参数为任务,第二个参数:延时多长时间启动该定时器, //第三个参数:周期频率,第四个参数:设定第2,3个参数的时间单位 service.scheduleAtFixedRate(() -> { String s = new Timestamp(System.currentTimeMillis()).toString(); System.out.println(s); }, 0, 20, TimeUnit.SECONDS);
scheduleWithFixedDelay周期计算方式:当前任务结束时间——下个任务开始时间,当前任务结束后开始计算周期频率,然后执行下个任务
service.scheduleWithFixedDelay(() -> { String s = new Timestamp(System.currentTimeMillis()).toString(); System.out.println(s); }, 0, 20, TimeUnit.SECONDS);
如果执行的任务对于时间间隔要求必须毫无差错和以及不存在时间累积增加的现象,推荐使用scheduleWithFixedDelay方法
-