定式调度的线程池ScheduledThreadPoolExecutor

目的:

区别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
*/

你可能感兴趣的:(定式调度的线程池ScheduledThreadPoolExecutor)