Java开发那些事Springboot

ScheduledThreadPoolExecutor线程池

2019-09-17  本文已影响0人  小胖学编程

1. ScheduledThreadPoolExecutor线程池
2. SpringBoot2.X整合定时线程池(ScheduledThreadPoolExecutor)

image.png

1. 线程池的构造方法

ScheduledThreadPoolExecutor最全构造方法:

    public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory,
                                       RejectedExecutionHandler handler) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory, handler);
    }

我们自定义ScheduledThreadPoolExecutor线程池的时候,可以设置核心线程数、线程工厂、拒绝策略

阻塞队列默认使用的是DelayedWorkQueue(延迟队列,是一个优先级队列,本质上就是堆)。保证每次出队时一定是当前队列中执行时间最靠前的。

使用Executors静态类快速创建ScheduledThreadPoolExecutor:

 Executors.newScheduledThreadPool(3);

2. 添加延时任务

因为ScheduledThreadPoolExecutor实现了ExecutorService接口,那么他也能够使用通用的executor或者submit提交任务,最终调用schedule方法,默认马上执行一次。若需要延迟执行,可直接使用schedule方法,传递时间参数。

//延迟delay时间后,执行任务。因为传入的是Runnable,故get()方法获取的为null
public ScheduledFuture<?> schedule(Runnable command,
                                       long delay, TimeUnit unit);
 //带返回值的延迟任务
 public <V> ScheduledFuture<V> schedule(Callable<V> callable,
                                           long delay, TimeUnit unit);

3. 添加周期任务

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
                                                  long initialDelay,
                                                  long period,
                                                  TimeUnit unit);

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
                                                     long initialDelay,
                                                     long delay,
                                                     TimeUnit unit);

4. 如何终止周期任务

方式一:抛出异常,即可终止定时任务。

        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
        scheduledExecutorService.scheduleWithFixedDelay(() -> {
            System.out.println("start scheduled...");
            throw new RuntimeException();
        }, 0, 1000, TimeUnit.MILLISECONDS);

方式二:调用Future的cancal方法

future.cancel(false);

文章参考

线程池之ScheduledThreadPoolExecutor

上一篇下一篇

猜你喜欢

热点阅读