В Java, эффективно ли использовать Thread.sleep (1) для свободного потока? - PullRequest
10 голосов
/ 14 марта 2012

У меня есть основной цикл в моем потоке, и часть из него проверяет, является ли булево значение бездействия истинным.Если это так, он будет вызывать Thread.sleep(1) при каждой итерации цикла.Это эффективный способ сделать это?Моя цель состоит в том, чтобы поток не использовал минимальное использование процессора во время простоя.

Ответы [ 2 ]

8 голосов
/ 14 марта 2012

Нет.Вместо этого используйте Object.wait и убедитесь, что вы синхронизируете объект, содержащий логическое значение.Если вы не синхронизируете и boolean не является volatile, у вас нет барьера памяти, поэтому нет никакой гарантии, что поток опроса увидит изменение в boolean.

В соответствии с javadoc :

Этот метод заставляет текущий поток (назовем его T) поместить себя в набор ожидания для этого объекта, а затем отказаться от любых заявлений на синхронизацию для этого объекта, Поток T отключается для целей планирования потоков и остается неактивным до тех пор, пока не произойдет одно из четырех:

  • Какой-то другой поток вызывает метод notify для этого объекта, и поток T происходит сбыть произвольно выбранным как поток для пробуждения.
  • Какой-то другой поток вызывает метод notifyAll для этого объекта.
  • Какой-то другой поток прерывает поток T.
  • ...

, поэтому поток не будет загружать ЦП, пока он ожидает уведомления.

Приведенный ниже код представляет собой простой флаг простоя с методом waitUntilIdle, который вашМетод main может вызывать и метод setIdle, который может вызываться другим потоком.

public class IdleFlag {
  private boolean idle;

  public void waitUntilIdle() throws InterruptedException {
    synchronized (this) {
      while (true) {
        // If the flag is set, we're done.
        if (this.idle) { break; }
        // Go to sleep until another thread notifies us.
        this.wait();
      }
    }
  }

  public void setIdle() {
    synchronized (this) {
      this.idle = true;
      // Causes all waiters to wake up.
      this.notifyAll();
    }
  }
}
1 голос
/ 14 марта 2012

Я согласен с @Mike Samuel, но я бы порекомендовал вам использовать пакеты одновременной блокировки ...

Продолжите с парадигмой Майка, просто замените его блокировку на введенную в Java 5

.

В частности, вы можете использовать Условия условия ожидания - те, которые требуют тайм-аута. Таким образом, вы можете, например, регистрировать сообщения время от времени - сообщения, которые помогут вам отлаживать бесконечные ожидания. Вы также можете выполнить некоторую логику отката, если время ожидания истекло ...

...