我在这里做的事真的很蠢吗?我试图每隔一分钟左右执行一次方法,永远,或直到我停止程序。
while(true) {
this.doSomethingPeriodically();
Calendar now = Calendar.getInstance();
int minutes = now.get(Calendar.MINUTE);
int resume = minutes + 1;
while (now.get(Calendar.MINUTE) < resume) {
// waiting for a minute
}
}
答案 0 :(得分:13)
此代码永远不会离开循环。这是一个无限循环,因为Calendar
引用的now
实例不会改变。
另外,你在这里尝试做的是实现busy waiting这是一个非常糟糕的主意(它使用CPU时间不做任何有趣的事情)。
正确的睡眠方式是使用Thread.
sleep()
。
答案 1 :(得分:4)
尝试使用Timer类。这是为了这种事情。 http://www.javapractices.com/topic/TopicAction.do?Id=54 http://java.sun.com/j2se/1.4.2/docs/api/java/util/Timer.html
编辑: 我刚看到有一个更新的Timer:ExecutorService。我从未使用它,但它似乎有一些优点。 http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ExecutorService.html Java Timer vs ExecutorService?
答案 2 :(得分:4)
在java中重复执行任务的最简单方法是java.util.TimerTask和java.util.Timer api。
一个简单的代码是:
public class PrinterTimerTask extends java.util.TimerTask {
@Override
public void run() {
System.out.println( 'Current time is: ' + System.nanoTime() );
}
public static void main(String[] args) {
long delay = 0;
long period = 60000;
java.util.Timer timer = new java.util.Timer(threadName);
PrinterTimerTask task = new PrinterTimerTask();
timer = new Timer("SomeThreadNameForProfiler");
timer.schedule( task, delay, period );
}
}
变量: 任务 - 要安排的任务。 延迟 - 执行任务之前的延迟(以毫秒为单位)。 period - 连续任务执行之间的时间(以毫秒为单位)。
更多信息: Timer和TimerTask javadoc: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Timer.html http://java.sun.com/j2se/1.5.0/docs/api/java/util/TimerTask.html
另一个例子: http://www.javapractices.com/topic/TopicAction.do?Id=54
[]的,
过去
答案 3 :(得分:3)
尝试使用sleep,因为它不会导致处理器继续处理线程:
while(true) {
this.doSomethingPeriodically();
Thread.sleep(60000);
}
答案 4 :(得分:2)
答案 5 :(得分:1)
您在这里尝试做的是busy waiting。您不必要地使用了大量的CPU时间(如果您修复了错误并在每个循环中创建了一个新的Calendar实例,您甚至会使用不必要的内存。)
你真正想要的是方法Thread.sleep()
,它在tutorial on sun.com中得到了很好的解释。
答案 6 :(得分:0)
最好使用sleep函数:CurrentThread.sleep()
并指定延迟时间所需的毫秒数。这比忙碌的等待更好......