JAVA定时任务

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 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

你可能感兴趣的:(JAVA定时任务)