2009-09-28 2 views
1

Я делаю что-то действительно глупо здесь? Я пытаюсь выполнить метод каждую минуту или так, навсегда, или пока я не остановлю программу.Затянет ли мой поток Java на минуту?

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

ответ

13

Этот код никогда не покинет цикл. Это бесконечный цикл, поскольку пример Calendar, на который ссылается now, не изменится.

Кроме того, что вы пытаетесь сделать здесь, это реализовать busy waiting, что является очень плохой идеей (она использует процессорное время, не делая ничего интересного).

Правильный способ сна - использовать Thread.sleep().

+0

Итак, если бы у меня был новый экземпляр календаря, это сработало бы? Но я должен использовать сон() в любом случае, да? –

+0

Да, для обоих ;-) Если вы назначили новый экземпляр календаря теперь внутри цикла, он будет работать (если вы не входите в цикл в минуту 59 часа ;-)), но вы должны использовать sleep() во всяком случае. –

+1

Понял. Я бы изобретал колесо и делал его квадратным, а не круглым, так сказать. Благодаря! –

2

Лучше использовать Timer или, по крайней мере, использовать sleep.

+0

пример TimeUnit.MINUTES.sleep (4); – kozla13

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

Edit: Я только что прочитал, что есть новая замена таймера: ExecutorService. Я никогда не использовал его, но, похоже, он имеет некоторые преимущества. http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ExecutorService.html Java Timer vs ExecutorService?

+0

+1 - Я забыл о классе Timer. –

3

Попробуйте использовать вместо сна, так как это не заставит процессор продолжать работать на резьбе:

Thread.sleep()

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

Вы не должны расширять Thread (вместо этого выполнять Runnable), и вы не должны ссылаться на статические методы (например, Thread.sleep()) через ссылку. –

+0

Я бы также сказал, что лучше всего использовать короткое время сна и скорее повторить его и проверить, следует ли нам остановиться. – Svish

+0

@Svish, вот что значит 'InterruptedException'. – gustafc

1

То, что вы пытаетесь сделать здесь называется busy waiting. Вам необязательно использовать огромное количество процессорного времени (и вы даже использовали бы ненужную память, если бы исправили ошибку и создали новый экземпляр календаря в каждом цикле).

Что вы на самом деле хотите, это метод Thread.sleep(), это довольно хорошо объяснено в tutorial on sun.com.

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

Переменные: задачи - задачи должны быть запланированы. Задержка - задержка в миллисекундах перед выполнением задачи. период - время в миллисекундах между последовательными выполнением задач.

Дополнительная информация: Таймер и 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

[] s,

и мимо

0

Это лучше использовать функция сна: CurrentThread.sleep(), и вы указываете номер o f миллисекунды, которые вы хотите в качестве задержки. Это лучше, чем ожидание ...

+0

'CurrentThread' не является стандартным классом JDK ... – assylias

+0

Точный синтаксис: Thread.currentThread(). Sleep (delay); В параметре вы указываете задержку в msec ... – niz

+0

'sleep' является статическим методом, рекомендуется называть его классом:' Thread.sleep (...); '. – assylias

Смежные вопросы