java 中采用ScheduledExecutorService来进行定时任务调度。
ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
一、定时任务简单应用
1、简单的列子
public class Schedule1 {
    public static void main(String[] args) {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
        Runnable runnable = () -> {
            String name = Thread.currentThread().getName();
            DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            System.out.println(name + ":RUN1 正在执行任务!" + format.format(new Date()));
        };
        scheduledThreadPool.scheduleAtFixedRate(runnable, 0, 2, TimeUnit.SECONDS);
    }
}
2、ScheduledExecutorService
定时任务执行接口,有4中执行方法。
- 
schedule(Runnable command,long delay, TimeUnit unit);
创建并执行在给定延迟后启用的ScheduledFuture。 - 
schedule(Callable<V> callable, long delay, TimeUnit unit);
创建并执行在给定延迟后启用的单次操作。 - 
scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit); 固定频率
首次是initialDelay+period;下次就间隔period执行;计时是按照上个开始时间计算,如果任务执行时间超过period,那下次就直接执行了。如果超过多个period,下次多个都会同时执行。
重点:一次执行失败会导致,整个调度失败,务必扑捉住错误。 - 
scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit); 固定延迟
在上一个结束后和下一个开始之间给定延迟。 
ScheduledThreadPoolExecutor
作为ScheduledExecutorService的具体实现类。创建实例时候我们可以直接new,但我们一般采用Executors 去创建实例。
 ScheduledExecutorService scheduledThreadPool1=new ScheduledThreadPoolExecutor(10);
Executors
为方便管理线程,采用Executors 工厂方法去创建实例。
public class Executors {
    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
   public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }
    public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
    }
   public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }
}
取消定时任务
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(5);
        scheduler.setRemoveOnCancelPolicy(true);//cancel时会删除这个任务
        scheduler.initialize();
        ScheduledFuture<?> future=scheduler.scheduleAtFixedRate(runnable, 2000);
        try {
            Thread.sleep(10000);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        future.cancel(false);
        System.out.println("执行任务完毕");
二、源码结构
关联关系

image.png