2010-07-08 14 views
6

Por una línea quiero decir como máximo 100 caracteres por línea.¿Cómo cuelgas un hilo en Java en una línea?

(I básicamente necesito esto para mantener vivo el programa. El hilo principal registra oyentes de devolución de llamada que se ejecutan en hilos separados. Sólo necesito el principal para colgar para siempre y dejar que los otros hilos hacen su trabajo)

+4

¿por qué no dejar que el "hilo principal" simplemente termine? Si se están ejecutando subprocesos no-demonio, la VM no los terminará. –

+0

En realidad, no quería usar 100% de CPU en el hilo colgante. – rui

+0

@Carlos Heuberger - En realidad, no tengo acceso a los otros hilos. Están escondidos detrás de la biblioteca que uso. – rui

Respuesta

12

Hay algunas cosas que podría hacer que sería mejor que colgar el hilo inicial para siempre:

  1. Uso otherThread.join(). Esto causará que el hilo actual en el que está ejecutando se quede dormido hasta que el otro hilo haya terminado de ejecutarse.
  2. Como @nanda sugiere, use ExcecutorService.shutdown() para esperar hasta que haya terminado un grupo de subprocesos.
  3. Use otherThread.setDaemon(false) y simplemente deje salir su hilo inicial. Esto establecerá sus nuevos hilos como hilos de usuario. Java no se apagará hasta que los únicos subprocesos en ejecución sean subprocesos de daemon.
+0

lo siento si estoy equivocado, pero el uso de join() significa que solo hay dos hilos ¿no? programa principal y oyente. Mientras que el OP quiere oyentes. – nanda

+0

@nanda, la suposición (probablemente correcta) es que el OP quiere oyentes para que pueda ser notificado cuando los hilos han terminado de ejecutarse mientras el hilo principal está en algo así como un bucle 'sleep()' esperando que esto suceda. El trabajo de devolución de llamada adicional no es necesario si usa alguna de las respuestas dadas. – krock

+3

Simplemente recorra sus hilos y llame a join() para cada uno. Una vez que uno termina, el ciclo se unirá al próximo. Cuando su bucle sale, puede estar seguro de que el último hilo ha salido. –

-1
for(;;); 

Pero es muy poco probable que sea conveniente colgar el hilo. En su lugar, debe considerar opciones como unirse en los otros hilos.

+8

que hará maravillas para el uso de su CPU :-) – rsp

+0

@rsp, cierto. Esta es la forma de colgar el hilo, pero es muy poco probable que el OP realmente quiera hacer eso. –

5

Usar ejecutor. Al utilizar el método shutdown() obligará al ejecutor a esperar hasta que todos los hilos hayan terminado.

+1

Acepto, debe usar el nuevo paquete simultáneo: http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/util/concurrent/package-summary.html –

+0

luego el el porgrama principal no se 'colgará' para siempre – Redlab

+0

Apuesto el significado de 'para siempre' que OP significa que el programa principal espera hasta que todos los hilos hayan terminado. Podría estar equivocado :) – nanda

13
synchronized(this) { 
    while (true) { 
     this.wait(); 
    } 
} 

(gracias a Carlos Heuberger. El manejo de excepciones omitido en el código anterior)

Esto hará que la espera hilo actual en el monitor de la clase actual hasta que alguien llama notify(), o para siempre.

+0

+1 - pero tenga cuidado con los despertadores espurios: necesita un ciclo continuo alrededor de la espera, ya que puede retornar falsamente (es decir, sin ningún motivo). Atrapar InterruptedException también es necesario ... es un trazador de líneas más grande, pero probablemente la mejor solución (correcta) –

+0

No me gusta esta respuesta simplemente porque no estás esperando nada. (Todavía no votar abajo) –

+0

@Tim Bender - Estoy de acuerdo. Respondí instintivamente a "cómo abrir un hilo". :) – Bozho

0
public static void main(String[] args) { 
    Thread t = new Thread() { 
     @Override 
     public void run() { 
      try { 
       while (true) { 
        Thread.sleep(1000); 
       } 
      } catch (InterruptedException e) { 
      } 
     } 
    }; 
    t.setDaemon(false); 
    t.start(); 
} 
+5

Carga de la CPU cerca del 100%, supongo? –

+5

con Thread.sleep Yo diría que la CPU está más cerca al 0% –

3

Puede esperar thread.join para esperar todos los hilos.

4

Con un CountDownLatch puede esperar hasta que la cuenta atrás llegue a 0, si se asegura de que nunca cuente hacia abajo, tal vez solo cuando deba finalizar. (Esto también da como resultado 0% de CPU, lo contrario de los bucles que se ejecutarán para siempre, y con join() su aplicación aún terminará cuando terminen todos los demás hilos, la opción del ejecutor es mejor, pero también terminará cuando todas las tareas ejecutadas he terminado)

6

Thread.sleep(Long.MAX_VALUE);

Ok, por lo que no es para siempre, pero hablar de un tiempo muy largo :)

+0

envuelto en esto mientras (verdadero), me encanta. –

+2

¡Envolviéndolo mientras es redundante para todos los propósitos prácticos ya que el hilo dormirá durante 292471208.7 años! Prácticamente eso es para siempre ... –

+0

Creo que hay una condición excepcional que requeriría el tiempo para ignorar. –

0

while (true) {Thread.sleep (1000); }

+2

Es un desperdicio y poco intuitivo dejar que el hilo se active cada segundo para volverlo a dormir. Vea la respuesta de Tim Benders para una mejor aproximación usando 'Thead.sleep (long)'. – Zero3

1

Aquí hay una solución que es de una sola línea, en la que solo tiene que agregar una línea adicional. (Sin embargo, debe agregar synchronized y throws InterruptedException a su declaración main). Además, no necesita acceder ni conocer los hilos en la biblioteca que está utilizando.

public static synchronized void main(String[] args) throws InterruptedException{ 
    ... 
    YourMainClass.class.wait(); // wait forever 
} 

Se asume que nunca llamar notify en su clase principal y que desea salir si obtiene un InterruptedException. (Puede agregar un while (true) { ... } alrededor de la línea wait si realmente quiere protegerse de eso.)

+0

Simple y elegante, funciona como un encanto. –

Cuestiones relacionadas