管理延迟任务和周期任务以及获取任务的结果

延迟任务和周期任务

在 Java 中,管理延迟和周期任务主要有两种方式:
Timer 和 ScheduledThreadPoolExecutor

Timer

Timer 可以管理延迟任务和周z期任务,但存在一些缺陷:

  1. Timer 是单线程的,如果某个任务执行时间过长可能会破坏其它 TimerTask 的定时准确性。
  2. Timer 线程不会捕捉异常,若 TimerTask 抛出未受查异常则将终止整个 Timer 线程,该状况称为线程泄露(Thread Leakage)。
  3. Timer 只支持绝对时间而非相对时间的调度机制,因此对系统时钟变化很敏感。
ScheduledThreadPoolExecutor:
  1. 支持多线程来执行延时任务或周期任务。
  2. 只支持基于相对时间的调度机制,对系统时钟不敏感。
  3. 能处理表现出错误行为的任务。
当 TimerTask 抛出运行时异常

由于 Timer 线程不会捕捉异常,当 TimerTask 抛出未受查异常时会终止整个 Timer 线程,且无法恢复,整个 Timer 因此而结束。这导致了已经被调度但尚未执行的 TimerTask 不会再执行,而新的任务也不能再被调度。

下面的例程中,TimerTask 将主动抛出一个 RuntimeException,程序并没有在运行六秒后退出,而是只运行了 1 秒就结束了,且抛出了异常:java.lang.IllegalStateException: Timer already cancelled。

import java.util.Timer;
import java.util.TimerTask;
import static java.util.concurrent.TimeUnit.SECONDS;

public class OutOfTime {
    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(1);
        timer.schedule(new ThrowTask(), 1);
        SECONDS.sleep(5);
    }
    static class ThrowTask extends TimerTask {
        public void run() {
            throw new RuntimeException();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值