这会暂停我的Java线程一分钟吗?

时间:2009-09-28 13:38:20

标签: java calendar

我在这里做的事真的很蠢吗?我试图每隔一分钟左右执行一次方法,永远,或直到我停止程序。

    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
        }
    }

7 个答案:

答案 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,因为它不会导致处理器继续处理线程:

Thread.sleep()

    while(true) {
            this.doSomethingPeriodically();
            Thread.sleep(60000);
    }

答案 4 :(得分:2)

最好使用Timer或至少使用sleep

答案 5 :(得分:1)

您在这里尝试做的是busy waiting。您不必要地使用了大量的CPU时间(如果您修复了错误并在每个循环中创建了一个新的Calendar实例,您甚至会使用不必要的内存。)

你真正想要的是方法Thread.sleep(),它在tutorial on sun.com中得到了很好的解释。

答案 6 :(得分:0)

最好使用sleep函数:CurrentThread.sleep()并指定延迟时间所需的毫秒数。这比忙碌的等待更好......