java - 不断取消并重新创建 Timer,Java 中的 TimerTask

标签 java jakarta-ee timer

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

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

递增计数器(每秒)的相同 TimerTask 定义方法也是我每次调用 NIST 服务器(每十分钟)时必须暂停和重新安排的方法。我在 NIST 服务器调用之前 暂停/取消现有 Timer/TimerTask 对象以及在调用之后 重新安排 TimerTask 都没有成功。

由此产生的异常描述如下: How do I use a timer in Java when required to set and cancel multiple times?

可以这么说,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 void run(){
        incrementCurrentTimeAndTestDeadline();
    }

我在 NIST 服务器调用之间以 10 分钟和 1 分钟的间隔运行了几次这段代码,运行顺利。

那么,经过这么长时间的准备(感谢您的耐心等待),这就是我的问题:目前被迫使用我拥有的代码,是否有任何损害可能导致长跑?如果我不断创建新的 TimerTask 和 Timer 对象,同时清空旧对象,比方说,在一个月或六个月的时间内,我会强制服务器耗尽内存吗? Java 的垃圾收集是否足够强大以处理这种使用?还会发生其他可怕的事情吗?

非常感谢您的宝贵时间, - 以利

最佳答案

Java 会很好地处理定时器任务的创建和放弃。您需要确保在使用完计时器后删除所有对计时器的引用(看起来您正在这样做),然后当 GC 运行时它将清除计时器引入的所有垃圾。

你很安全。

您应该注意到,在很长一段时间内,一些 Java 进程倾向于不断分配内存,直到达到它们的 -Xmx 限制。这并不意味着存在问题(因为该空间将被 GC 重用),但这也意味着,如果您希望长时间运行的 Java 进程具有相对较小的占用空间,则不应指定 -Xmx 比您实际需要的大得多。

关于java - 不断取消并重新创建 Timer,Java 中的 TimerTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19841465/

相关文章:

java - Android map V2 绘制的圆圈未更新

java - Retrofit 调用包含错误 必需的 Retrofit2.Call,发现无效

jakarta-ee - 任何类型的查询都找不到持久化实体

C# 在特定时间执行函数

Java函数在时间过去后结束

c# - 如果使用 System.Threading.Timer,是否需要 BackgroundWorker?

java - 获取 DOM 树中所有根到叶路径的列表

java - 无法使用 JDBC 驱动程序连接到 Salesforce

java - Spring MVC Tiles jsp 页面无法正确加载

java - 创建没有 Vaadin 插件的 Vaadin 项目