java timer 销毁_在Java中不断清空并重新创建Timer,TimerTask

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

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

每次调用NIST服务器时(每十分钟一次),必须暂停和重新安排计数器递增计数器的TimerTask定义方法(每秒一次).在NIST服务器调用之前暂停/取消现有的Timer / TimerTask对象并在调用后重新调度TimerTask时,我没有成功.

可以这么说,即使使用purge()或者cancel(),TimerTask和Timer都不能被多次调度,这似乎只适合将这些对象设置为符合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比实际需要的大得多.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值