jdk1.8 java.util_JDK1.8 java.util.Timer类探索

一、Timer支持并行处理

java.util.Timer类的作者是大名鼎鼎的Josh Bloch,他可是Java集合框架的作者,谷歌首席架构师。最近一直想研究定时任务,所以就从最最古老的类开始使用吧。

从API文档里看到一个延迟的方法,就是延迟执行任务。我这里的每个任务都是打印任务名称。但是延迟的时间从5秒递减到1秒。运行结果是什么呢?

public static void main(String[] args) {

Timer timer = new Timer();

timer.schedule(getRandomTask(5), 5000);

timer.schedule(getRandomTask(4), 4000);

timer.schedule(getRandomTask(3), 3000);

timer.schedule(getRandomTask(2), 2000);

timer.schedule(getRandomTask(1), 1000);

}

private static TimerTask getRandomTask(int num) {

TimerTask task = new TimerTask() {

@Override

public void run() {

System.out.println("任务" + num);

}

};

return task;

}

746dd5852bbb01183fe9ceaed9e165b3.png

从运行结果来看,看来Timer类内部很可能维护了一个"任务队列",并且知道这个任务在具体得某一刻开始执行。延迟最小的任务1只延迟了1秒,所以第一个打印出来。相反,任务5虽然在主函数的第一行执行,但是延迟5秒后才最后打印出来。所以可以确定,一个Timer对象能够执行多个任务。

拨云见日

Timer类的执行是支持多线程并行处理的。

二、再谈Timer类异常处理

下面的代码几乎与上面得相同,只是在构造任务的时候加了一个限制,就是说如果执行了任务3会出错。运行结果又会是什么呢?

public static void main(String[] args) {

Timer timer = new Timer();

timer.schedule(getRandomTask(5), 5000);

timer.schedule(getRandomTask(4), 4000);

timer.schedule(getRandomTask(3), 3000);

timer.schedule(getRandomTask(2), 2000);

timer.schedule(getRandomTask(1), 1000);

}

private static TimerTask getRandomTask(int num) {

TimerTask task = new TimerTask() {

@Override

public void run() {

System.out.println("任务" + num);

if (num == 3) {

String error = "任务" + num + "报错";

throw new RuntimeException(error);

}

}

};

return task;

}

我把本次运行结果与上次运行结果拿出来对比一下。任务3报错,实际上就会让本该执行的任务4与任务5执行不了。换句话说,Timer类在多线程并行处理任务的时候,只要其中一个定时任务出错,那么其它任务也都会自动停止运行。这在生产库上是绝对不允许的。或许这也是Timer被废弃的重要缺陷之一吧。

本次程序运行结果:

70df03e0ecc234720d9623d6f5ca2d83.png

上次程序运行结果

746dd5852bbb01183fe9ceaed9e165b3.png

拨云见日

Timer类在执行多个任务的时候,如果其中一个任务出错,并且没有捕获异常的话,其它任务也会终止执行。所以为了防止这种情况的出现,需要为每个任务使用try--catch语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值