小编Ili*_*kov的帖子

在 Java 中不断清零并重新创建 Timer、TimerTask

我知道使用 Timer 和 TimerTask 不再是当前公认的做法(有些人建议使用线程,其他人建议使用 ScheduledExecutorService 或其变体),所以这个问题不是关于良好的编程实践,而是关于实际错误或异常的可能性.

本质上,我拥有的是一个 servlet,它保持一个每秒递增的运行计数器(它是一个静态 Calendar 对象)。当达到指定的截止日期时(默认情况下我们达到 10 分钟),我从我的应用程序调用 NIST 时间服务器以获取当前时间,然后我用它来重新设置我的计数器。

增加计数器(每秒)的相同 TimerTask 定义的方法也是每次我调用 NIST 服务器(每 10 分钟)时必须暂停和重新安排的方法。我在暂停不成功/取消现有的定时器/ TimerTask的对象,之前的NIST调用服务器并重新安排一个TimerTask调用。

此处描述了由此产生的异常: 当需要多次设置和取消时,如何在 Java 中使用计时器?

可以这么说,TimerTask 和 Timer 都不能被多次调度,即使使用 purge() 或 cancel(),这似乎只适用于将这些对象设置为符合 Java 垃圾收集的条件。

使用 wait() 和 notify() 导致同步异常,不幸的是,我没有时间弄清楚,所以我最初的线程实验失败了。

我最终做的是这样的:

secondTickerTask.cancel();
secondTicker.purge();
secondTicker.cancel();

secondTickerTask = null;
secondTicker = null;

Date newCurrentTime = getNistTimeFromFirstWorkingServer();

// Save new date to current time, reset second counter.
setCurrentTimeAndDeadline(newCurrentTime);
startSecondIncrementTimer(newCurrentTime);

secondTicker = new Timer();
secondTickerTask = new TimerTask(){
    public …
Run Code Online (Sandbox Code Playgroud)

java timer jakarta-ee

5
推荐指数
1
解决办法
460
查看次数

标签 统计

jakarta-ee ×1

java ×1

timer ×1