2012-03-14 5 views
10

Tengo un bucle principal en mi hilo, y parte de él prueba si un booleano inactivo es verdadero. Si lo es, llamará al Thread.sleep(1) en cada iteración del ciclo. ¿Es esta una forma eficiente de hacer esto? Mi objetivo es que el hilo tome un uso mínimo de la CPU cuando está inactivo.En Java, ¿es eficiente usar Thread.sleep (1) para un hilo inactivo?

+0

¿No tardará el sistema en cambiar constantemente los hilos de esta manera? Requiere poder de procesamiento para que el administrador de hilos haga su trabajo, y usted le pide que haga ese trabajo cada milisegundo. – scriptocalypse

+0

Eso es algo que sospechaba que podría suceder, pero no estaba seguro en ese momento. Parece que 'wait' y' notifyAll' harán el trabajo bien. – AutoBotAM

Respuesta

8

No. Use Object.wait en su lugar y asegúrese de sincronizar en el objeto que contiene el booleano. Si no sincroniza y el boolean no es volatile, no tiene barrera de memoria, por lo que no hay garantía de que el hilo de sondeo vea el cambio al boolean.

Según la javadoc:

Este método hace que el hilo actual (llamarlo T) para colocarse en el conjunto de espera para este objeto y luego a renunciar a cualquier y todas las reclamaciones de sincronización en este objeto. hilo T se incapacita para fines de programación hilo y permanece latente hasta que uno de cuatro cosas sucede:

  • Algunos otro hilo invoca el método notify para este objeto y enrosque T pasa a ser elegido arbitrariamente como el hilo que se despertó .
  • Alguna otra hebra invoca el método notifyAll para este objeto.
  • algún otro flujo interrumpe T. hilo
  • ...

modo que el hilo no tomará ninguna CPU mientras se está a la espera de ser notificado.

El código siguiente es una bandera de inactividad simple con un método waitUntilIdle que su método main puede llamar y un método setIdle que puede ser llamado por otro subproceso.

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(); 
    } 
    } 
} 
+0

Aunque funcionará, ¿cuál es el motivo de 'while (true)' fuera de la sincronización? Simplemente terminará soltando la cerradura y volviendo a adquirirla después de la espera (y luego volviendo a soltarla). Como se propuso tener el 'while (verdadero)' dentro de la sincronización, adquiere/libera la semántica (solo una vez) por cada vez que se notifica la espera (regular o espuria). –

+1

Bueno, supongo que mi punto es que puedes simplemente 'while' dentro de la sincronización en la que no incurrirías en el lanzamiento/adquisición extra haciéndolo afuera. Tiene razón, no causa ningún daño funcional y el impacto en el rendimiento es probablemente insignificante. –

+0

@JohnVint, Buen punto. Editado –

1

Estoy de acuerdo con @ Mike Samuel, sin embargo, me gustaría recomendar que utilice el concurrent lock packages...

continuar con el paradigma de Mike acaba de reemplazar a su bloqueo al introducido en Java 5

Más específicamente se puede usar Condition's métodos de espera, aquellos que toman tiempos de espera. De esta forma, puede, por ejemplo, registrar un mensaje de vez en cuando, un mensaje que le ayudará a depurar esperas infinitas. Es posible que también desee realizar alguna lógica de reversión si aguarda un tiempo límite ...

+0

Hay una versión de 'wait' que requiere un tiempo de espera, por lo que si solo desea obtener tiempo de CPU cada tanto para iniciar sesión, es más fácil utilizar la llamada' wait (timeout) 'que introducir' Condition's. –

+0

@John Haager - gracias por la información, me da vergüenza decir que no me había enterado de eso – Yaneeve

+0

Aún así - las condiciones están relacionadas con las cerraduras, y le permiten hacer cosas más interesantes que simples sincronizaciones – Yaneeve

Cuestiones relacionadas