美文网首页
定式调度的线程池ScheduledThreadPoolExecu

定式调度的线程池ScheduledThreadPoolExecu

作者: 全栈未遂工程师 | 来源:发表于2016-08-23 11:02 被阅读243次

    目的:

    区别scheduleAtFixedRatescheduleWithFixedDelay的用法。

    api:

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

    创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。如果任务的任何一个执行遇到异常,则后续执行都会被取消。否则,只能通过执行程序的取消或终止方法来终止该任务。如果此任务的任何一个执行要花费比其周期更长的时间,则将推迟后续执行,但不会同时执行。

    注意: 如果执行这个命令花费时间比间隔时间period长,那么下一个任务会在该任务执行完之后立即执行。

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

    创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。如果任务的任一执行遇到异常,就会取消后续执行。否则,只能通过执行程序的取消或终止方法来终止该任务。

    注意: 执行完本任务之后,等待延迟时间之后,在执行下一次任务。

    实例:

    package com.novel.collect;
    
    import java.util.Date;
    import java.util.concurrent.ScheduledThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    import org.apache.log4j.Logger;
    
    public class CollectScheduledThread {
        private static Logger log = Logger.getLogger(CollectScheduledThread.class);
        private static ScheduledThreadPoolExecutor threadPool;
        static{
            threadPool = new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors());
        }
    
        public static void main(String[] args) {
            threadPool.scheduleAtFixedRate(new CollectRunnable("任务1"), 0, 1, TimeUnit.MINUTES);
            threadPool.scheduleWithFixedDelay(new CollectRunnable("任务2"), 0, 1, TimeUnit.MINUTES);
        }
    
    }
    class CollectRunnable implements Runnable{
        private String name = "";
        
        public CollectRunnable(String name) {
            this.name = name;
        }
        @Override
        public void run() {
            System.out.println("任务【" + name + "】执行。" + new Date());
            try {
                Thread.sleep((long) (1000*60*1.5));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    /*
    任务【任务2】执行。Tue Aug 23 09:57:38 CST 2016
    任务【任务1】执行。Tue Aug 23 09:57:38 CST 2016
    任务【任务1】执行。Tue Aug 23 09:59:08 CST 2016
    任务【任务2】执行。Tue Aug 23 10:00:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:00:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:02:08 CST 2016
    任务【任务2】执行。Tue Aug 23 10:02:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:03:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:05:08 CST 2016
    任务【任务2】执行。Tue Aug 23 10:05:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:06:38 CST 2016
    任务【任务2】执行。Tue Aug 23 10:07:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:08:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:09:38 CST 2016
    任务【任务2】执行。Tue Aug 23 10:10:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:11:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:12:38 CST 2016
    任务【任务2】执行。Tue Aug 23 10:12:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:14:08 CST 2016
    任务【任务2】执行。Tue Aug 23 10:15:08 CST 2016
    任务【任务1】执行。Tue Aug 23 10:15:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:17:08 CST 2016
    任务【任务2】执行。Tue Aug 23 10:17:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:18:38 CST 2016
    任务【任务1】执行。Tue Aug 23 10:20:08 CST 2016
    */
    

    相关文章

      网友评论

          本文标题:定式调度的线程池ScheduledThreadPoolExecu

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