woshikid / blog

Apache License 2.0
8 stars 1 forks source link

Java中的TimerTask #153

Open woshikid opened 3 years ago

woshikid commented 3 years ago

Timer

Timer timer = new Timer();
TimerTask task = new TimerTask() {
    @Override
    public void run() {
        System.out.println("running");
    }
};

// TimerTask只能被schedule一次
// Timer使用单线程执行任务,因此TimerTask不会并发执行
// TimerTask抛出异常时则整个Timer停止运行
timer.schedule(task, new Date()); // 在指定时间执行一次
//timer.schedule(task, 10000); // 在指定延时后执行一次
//timer.schedule(task, new Date(), 3000); // 在指定时间后按指定间隔重复执行,对于错过的执行不进行补偿
//timer.schedule(task, 10000, 3000); // 在指定延时后按指定间隔重复执行,对于错过的执行不进行补偿
//timer.scheduleAtFixedRate(task, new Date(), 3000); // 在指定时间后按指定间隔重复执行,对于错过的执行会进行补偿
//timer.scheduleAtFixedRate(task, 10000, 3000); // 在指定延时后按指定间隔重复执行,对于错过的执行会进行补偿

task.cancel(); // 结束此任务
timer.cancel(); // 结束Timer
timer.purge(); // 清除TimerTask引用,GC友好

ScheduledExecutorService

// 不同的任务可以并发执行,但同一任务不会并发执行
// 任务抛出异常时则该任务停止运行
ScheduledExecutorService executor = Executors.newScheduledThreadPool(8);
ScheduledFuture<?> future = executor.schedule(task, 10, TimeUnit.SECONDS); // 在指定延时后执行一次
//ScheduledFuture<?> future = executor.scheduleAtFixedRate(task, 10, 3, TimeUnit.SECONDS); // 在指定延时后按指定间隔重复执行,对于错过的执行会进行补偿
//ScheduledFuture<?> future = executor.scheduleWithFixedDelay(task, 10, 3, TimeUnit.SECONDS); // 在指定延时后按上次执行结束后的指定间隔重复执行

future.cancel(false); // 结束此任务
executor.shutdown(); // 结束ScheduledExecutorService