代码实现
使用Timer即可,下述是示例代码
public static void main(String[] args) {
Timer timer = new Timer();
AtomicInteger time = new AtomicInteger(0);
log.info("开始执行=====================");
long tim = 2000;
timer.schedule(new TimerTask() {
@Override
public void run() {
log.error("停止执行");
timer.cancel();
}
}, 7000);
timer.schedule(new TimerTask() {
@Override
public void run() {
int i = time.incrementAndGet();
log.error("执行" + i + "次");
if (i == 5 ){
timer.cancel();
}
}
}, 1000, tim);
}
运行结果
17:04:54.155 [main] INFO testTimer.testM - 开始执行=====================
17:04:55.163 [Timer-0] ERROR testTimer.testM - 执行1次
17:04:57.160 [Timer-0] ERROR testTimer.testM - 执行2次
17:04:59.174 [Timer-0] ERROR testTimer.testM - 执行3次
17:05:01.159 [Timer-0] ERROR testTimer.testM - 停止执行
缺点
一:Timer线程不会捕获异常
,所以TimerTask抛出的未检查的异常会终止timer线程。
- 如果Timer线程中存在多个计划任务,其中一个计划任务抛出未检查的异常,则会引起整个Timer线程结束,从而导致其他计划任务无法得到继续执行。
二:Timer线程时基于绝对时间
(如:2023/02/14 16:06:00),因此计划任务对系统的时间的改变是敏感的。
- 假如你希望任务1每个10秒执行一次,某个时刻,你将系统时间提前了6秒,那么任务1就会在4秒后执行,而不是10秒后
三:Timer是单线程
,如果某个任务很耗时,可能会影响其他计划任务的执行。
- Timer执行程序是有可能延迟1、2毫秒,如果是1秒执行一次的任务,1分钟有可能延迟60毫秒,一小时延迟3600毫秒,相当于3秒(如果你的任务对时间敏感,这将会有影响)