Java 一个优于Timer的定时器——ScheduledThreadPoolExecutor

 TimeUnit 时间单元

       换算进制:

static final long C0 = 1L; // 1微毫秒
static final long C1 = C0 * 1000L; // 1微秒=1000微毫秒
static final long C2 = C1 * 1000L; // 1毫秒=1000微秒
static final long C3 = C2 * 1000L; // 1秒=1000毫秒
static final long C4 = C3 * 60L; // 1分=60秒
static final long C5 = C4 * 60L; // 1时=60分
static final long C6 = C5 * 24L; // 1天=24时



       2) 以指定格式快速实现线程停滞       1) 可以快速实现时间格式转换
       toNanos、toMicros、toMillis、toSeconds、toMinutes、toHours、toDays

       sleep
       TimeUnit.SECONDS.sleep(1); <=> Thread.sleep(1000) // 线程等待1秒

2. ScheduledThreadPoolExecutor

      1) ScheduledThreadPoolExecutor是在JDK1.5以后提供可以实现定时、重复运行任务的功能,类似Timer,优于Timer

      2) 构造方法

             a) ScheduledThreadPoolExecutor(int corePoolSize)使用给定核心池大小创建一个新 ScheduledThreadPoolExecutor

       b)ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactorythreadFactory)使用给定的初始参数创建一个新对象

b可以提供线程创建工厂


private final static ScheduledThreadPoolExecutor schedual = new ScheduledThreadPoolExecutor(1, newThreadFactory() { 
            
    private AtomicInteger atoInteger = new AtomicInteger(0); 
            
    public Thread newThread(Runnable r) { 
        Thread t = new Thread(r); 
        t.setName("xxx-Thread "+ atoInteger.getAndIncrement()); 
        returnt; 
    } 
});


             a) schedule(Callable callable, long delay, TimeUnit unit); 延迟delay时间后开始执行callable      3) 调度方法

             b) scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);  延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,如果command运行时间较长、可能会同时执行(周期时间包括command运行时间)

             c) scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit); 延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,并且保证在上次运行完后才会执行下一次(周期时间不包括command运行时间)

      4) 全局线程方法参数

             a) setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) 如果value为true,则在主线程shutdown()方法后如果还没有执行(未达到delay的时间),则延迟任务仍然有机会执行,反之则不会执行,直接退出。(针对b、c方法)

             b) setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) 如果value为true,则在主线程shutdown()方法后如果还没有执行(未达到delay的时间),则延迟任务仍然有机会执行,反之则不会执行,直接退出。(针对a方法)

3. ScheduledFuture 

        在执行调度之后返回该对象。它可以判断任务是否已经执行、是否已经取消、取消以后的操作

4. 操作实例


/**
* 定时执行任务
* 
* 
*/
public class TestTimer implements Runnable {
     
    public static void main(String[] args) {
        new TestTimer();
    }
     
    /**
     * 时间调度器
     */
    private final static ScheduledThreadPoolExecutor schedual = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
     
        private AtomicInteger atoInteger = new AtomicInteger(0);
     
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setName("xxx-Thread "+ atoInteger.getAndIncrement());
            return t;
        }
    });
     
    /**
     * 设置调度shutdown后停止执行任务
     */
    static{
        schedual.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
        schedual.setContinueExistingPeriodicTasksAfterShutdownPolicy(false);
    }
     
    /**
     * 执行结果
     */
    private ScheduledFuture<?> scheduledFuture;
    static int count;
     
    public TestTimer() {
        // scheduledFuture = schedual.schedule(this, 20, TimeUnit.SECONDS); // 20秒后执行
        System.out.println("调度时间:"+ timeFormater.format(newDate()));
        // schedual.scheduleAtFixedRate(this, 5, 2, TimeUnit.SECONDS); // 5秒后每隔2秒执行一次(不论上次是否执行完毕)
        scheduledFuture = schedual.scheduleWithFixedDelay(this, 5, 2, TimeUnit.SECONDS); // 5秒后每隔2秒执行一次(在上次执行完毕后开始)
    }
     
    private final static SimpleDateFormat timeFormater = new SimpleDateFormat("HH:mm:ss:SSS");
     
    public void run() {
        if(count++ > 5) {
            System.out.println("执行已经满足5次,本次任务取消!");
            scheduledFuture.cancel(false);
            schedual.shutdown();
            return;
        }
        System.out.println("运行时间:"+ timeFormater.format(new Date()));
        System.out.println("当前线程名称:"+ Thread.currentThread().getName());
        try{
            TimeUnit.SECONDS.sleep(4);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("完成时间:"+ timeFormater.format(new Date()));
        System.out.println("---------------------------");
    }
     
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值