JAVA定时任务

2022-05-23  本文已影响0人  松松木tell

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中执行方法。

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
上一篇 下一篇

猜你喜欢

热点阅读