更新当前时间日期而不会在内存中爆炸

时间:2014-07-11 13:06:27

标签: java date time

我编写了以下Java代码:

Calendar now = Calendar.getInstance();
now.setTime(new Date());
Date currentDate = null;

while (now.compareTo(stop) < 0 ) {  
    currentDate = new Date();
    now.setTime(currentDate);
}

用于跟踪其他组件(特别是:Twitter Streaming侦听器)执行其他操作时的传递时间。所以,这并不意味着简单的睡眠,因为其他组件同时运行:这个循环只是为了让机器停留一段时间,直到stop指示的日期到来。

然而,通过这样做,内存大小不断增加。我描述了这个东西,我发现这会在内存中产生大量的Date个对象。

有更聪明的方法吗?

提前谢谢。

1 个答案:

答案 0 :(得分:3)

最小的变化是使用setTimeInMillis而不是setTime来使用System.currentTimeMillis

while (now.compareTo(stop) < 0 ) {                  // Ugh, busy wait, see below
    now.setTimeInMillis(System.currentTimeMillis());
}

......或者实际上,首先只使用毫秒:

long stopAt = stop.getTimeMillis();
while (System.currentTimeMillis() < stopAt) {       // Ugh, busy wait, see below
}

然而,肯定有更广泛的背景,有一种方法可以避免忙碌等待。繁忙的等待几乎不合适。

  

因此,这并不意味着简单的睡眠,因为其他组件同时运行:此循环只是为了让机器保持一段时间,直到stop指示的日期到来。

可能这些组件正在其他线程上运行,因为while循环是忙等待。

在这种情况下,这个帖子应该睡觉 - 要么是一段时间,要么直到它被其他东西吵醒。

例如,你还没有说stop是什么,但正如你在compareTo使用它时可能是Calendar。因此,应该可以在stopnow以及getTimeInMillis之间获得差异(以毫秒为单位,通过sleep),而不是忙于等待:

Calendar now = Calendar.getInstance(); // Initializes to "now", no need to do that yourself
long delay = stop.getTimeInMillis() - now.getTimeInMillis();
if (delay > 0) {
    Thread.sleep(delay);
}