Java定时任务接口ScheduledExecutorService

一、概述

  1. SheduleExecutorService 是JDK 1.5出来的;
  2. SheduleExecutorService 是基于线程池设计的定时任务类,每个调度任务都是会在线程池中分配到一个线程去执行,任务是并行的;
  3. 只有当调度任务运行时,ScheduledExecutorService 才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态;
  4. 其方法 schedule 是以相对延迟和周期作为参数。

     注意:通过 ScheduledExecutorService 执行的周期任务,如果任务执行过程中抛出了异常,那么 ScheduledExecutorService 就会停止执行任务,且不会周期地执行该任务了。所以想该任务一直被周期执行,那么需要 catch 一切可能的异常。

二、方法

Java定时任务接口ScheduledExecutorService_第1张图片

前两方法:是给定延迟后启用的一次性操作。后两方法:是周期性执行操作。

1.以固定频率周期执行任务

ScheduledFuture scheduleAtFixedRate(Runnable command,  
                                      long initialDelay,  
                                      long period,  
                                      TimeUnit unit); 
  • command - 要执行的任务
  • initialDelay - 首次执行的延迟时间
  • period - 连续执行之间的周期
  • unit - initialDelay 和 period 参数的时间单位

2.以固定延迟周期执行任务

ScheduledFuture scheduleWithFixedDelay(Runnable command,  
                                         long initialDelay,  
                                         long delay,  
                                         TimeUnit unit);  
  • command - 要执行的任务
  • initialDelay - 首次执行的延迟时间
  • delay - 一次执行终止和下一次执行开始之间的延迟
  • unit - initialDelay 和 delay 参数的时间单位

3.Demo

调度线程任务

public class ScheduledExecutorServiceTest implements Runnable {

    ScheduledExecutorServiceTest() {
    }

    @Override
    public void run() {
        ... //需要执行的任务
        System.out.println("The current time is " +new Date() + ".");
    }
}

3.1 scheduleAtFixedRate

public static void main(String[] args) {
        ScheduledExecutorService seService = Executors.newScheduledThreadPool(2);
        
        // 从现在开始1分钟之后,每隔5分钟执行一次
        service.scheduleAtFixedRate(new ScheduledExecutorServiceTest(), 1, 5, TimeUnit.SECONDS);
    }

3.2 scheduleWithFixedDelay

public static void main(String[] args) {
        ScheduledExecutorService seService = Executors.newScheduledThreadPool(2);
        
        // 从现在开始1分钟之后,每此执行完后隔5分钟再执行一次
        service.scheduleWithFixedDelay(new ScheduledExecutorServiceTest(), 1, 5, TimeUnit.SECONDS);
    }

 

你可能感兴趣的:(JAVA)