我编写了以下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
个对象。
有更聪明的方法吗?
提前谢谢。
答案 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
。因此,应该可以在stop
和now
以及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);
}