美文网首页
JAVA定时任务

JAVA定时任务

作者: 松松木tell | 来源:发表于2022-05-23 15:30 被阅读0次

    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

    相关文章

      网友评论

          本文标题:JAVA定时任务

          本文链接:https://www.haomeiwen.com/subject/hhprprtx.html