Java ScheduledExecutorService 定时任务

开发中,偶尔会碰到需要定时器的需求,那ScheduledExecutorService跟Timer有啥区别呢?

Timer优势

单线程,如果需要多个定时任务的话,那么用Timer就不合适,因为Timer是单线程,如果有两个Timer的话,首先需要执行完第一个的Timer再执行第二个。

ScheduledExecutorService

允许多线程,每执行一次任务跟之前在执行的时候互不干涉

ScheduledExecutorService方法

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

创建并执行在给定延迟后启用的 ScheduledFuture。


schedule(Runnable command, long delay, TimeUnit unit)

创建并执行在给定延迟后启用的一次性操作。


scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnitunit)

创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。


scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,TimeUnit unit)

创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。

 

代码案例

    public static void main(String[] args) {
        //创建定时线程
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
        //设置日期格式
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //定时线程内部类
        executorService.scheduleWithFixedDelay(new Runnable(){
            int i = 0;
            @Override
            public void run() {
                //执行的时候自增
                i++;
                //判断是否等于3,等于就退出
                if(i == 3){
                    //退出定时
                    executorService.shutdown();
                }
                System.out.println("++++++++++++++++++++thread:" + df.format(new Date()));
            }

        }, 0, 3, TimeUnit.SECONDS);     //参数一: 几秒后开始执行任务, 参数二:几秒执行一次
        System.out.println("++++++++++++++++++++main:" + df.format(new Date()));
    }

运行结果

++++++++++++++++++++main:2020-09-12 15:39:07
++++++++++++++++++++thread:2020-09-12 15:39:07
++++++++++++++++++++thread:2020-09-12 15:39:10
++++++++++++++++++++thread:2020-09-12 15:39:13

Process finished with exit code 0

 

本站资源除特别声明外,转载文章请声明文章出处
东泰博客 » Java ScheduledExecutorService 定时任务

发表评论