Java计划任务:ScheduledThreadPoolExecutor

自JDK 1.5 开始,JDK提供了ScheduledThreadPoolExecutor类用于计划任务(又称定时任务),这个类有两个用途:

  • 在给定的延迟之后运行任务
  • 周期性重复执行任务

在这之前,是使用Timer类来完成定时任务的,但是Timer有缺陷:

  • Timer是单线程模式;
  • 如果在执行任务期间某个TimerTask耗时较久,那么就会影响其它任务的调度;
  • Timer的任务调度是基于绝对时间的,对系统时间敏感;
  • Timer不会捕获执行TimerTask时所抛出的异常,由于Timer是单线程,所以一旦出现异常,则线程就会终止,其他任务也得不到执行。

所以JDK 1.5之后,大家就摒弃Timer,使用ScheduledThreadPoolExecutor吧。

20.1 使用案例

假设我有一个需求,指定时间给大家发送消息。那么我们会将消息(包含发送时间)存储在数据库中,然后想用一个定时任务,每隔1秒检查数据库在当前时间有没有需要发送的消息,那这个计划任务怎么写?下面是一个Demo:

public class ThreadPool {

    private static final ScheduledExecutorService executor = new

        ScheduledThreadPoolExecutor(1, Executors.defaultThreadFactory());

    private static SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args){

        // 新建一个固定延迟时间的计划任务

        executor.scheduleWithFixedDelay(new Runnable() {

            @Override

            public void run() {

                if (haveMsgAtCurrentTime()) {

                    System.out.println(df.format(new Date()));

                    System.out.println("大家注意了,我要发消息了");

                }

            }

        }, 1, 1, TimeUnit.SECONDS);

    }

    public static boolean haveMsgAtCurrentTime(){

        //查询数据库,有没有当前时间需要发送的消息

        //这里省略实现,直接返回true

        return true;

    }

}

下面截取前面的输出(这个demo会一直运行下去):

2019-01-23 16:16:48

大家注意了,我要发消息了

2019-01-23 16:16:49

大家注意了,我要发消息了

2019-01-23 16:16:50

大家注意了,我要发消息了

2019-01-23 16:16:51

大家注意了,我要发消息了

2019-01-23 16:16:52

大家注意了,我要发消息了

2019-01-23 16:16:53

大家注意了,我要发消息了

2019-01-23 16:16:54

大家注意了,我要发消息了

2019-01-23 16:16:55

大家注意了,我要发消息了

这就是ScheduledThreadPoolExecutor的一个简单运用,想要知道奥秘,接下来的东西需要仔细的看哦。

20.2 类结构

public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor

    implements ScheduledExecutorService {

    public ScheduledThreadPoolExecutor(int corePoolSize,ThreadFactory threadFactory) {

         super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,

              new DelayedWorkQueue(), threadFactory);

    }

    //……

}

ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,实现了ScheduledExecutorService。 线程池在之前的章节介绍过了,我们先看看ScheduledExecutorService。

public interface ScheduledExecutorService extends ExecutorService {

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

    public <V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);

    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,

                                                  long initialDelay,

                                                  long period,

                                                  TimeUnit unit);

    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,

                                                     long initialDelay,

                                                     long delay,

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值