2009-05-19 12 views
7

Necesito encontrar una manera de separar un hilo de una llamada estática y no esperar a que se complete el subproceso. Básicamente, un enfoque de "fuego y olvídate". ¿Puede alguien proporcionarme un ejemplo simple de cómo se puede lograr esto?Java, no espere a que finalice un subproceso

+3

Eso es básicamente el comportamiento predeterminado de un hilo: ¿este hilo va a necesitar señalar el hilo de envío en algún momento o cambiar el estado de una variable compartida? Más detalles sería bueno. – Gandalf

Respuesta

26
Thread t = new Thread(new YourClassThatImplementsRunnable()); 
t.start(); 

// JDK 8 
new Thread(() -> methodYouWantToRun()).start(); 
7
public static void foo() { 
    new Thread() { 
     public void run() { 
        //do something here.... 
     } 
    }.start(); 
} 
+2

Pero si la tarea es relativamente simple, use el constructor Runnable para Thread (es decir, Thread nuevo (new Runnable() {public void run() {...}})), ya que de esa manera no está extendiendo un clase complicada, pero implementando una interfaz, que debería ser más simple en el bytecode y no tendrá ningún conflicto de nombres con los métodos en Thread. – Gracenotes

2

básicamente empezar el hilo y no te ejecutar un trabajo unirse. Entonces no esperarás que el hilo termine.

8

Si se trata de un hilo de larga duración que tiene un ciclo de vida similar a su aplicación en sí, y va a pasar mucho de su tiempo de espera en otros hilos:

new Thread(new yourLongRunningProcessThatImplementsRunnable()).start(); 

Si se trata de una corta duración , vinculado a la CPU de tareas:

ExecutorService es = Executors.newFixedThreadPool(Runtime.availableProcessors()); 
es.submit(new yourTaskThatImplementsRunnable()); 

Aunque, en la mayoría de casos como este, que va a presentar una serie de tareas a la misma ExecutorService.

Ver:

5

Dependiendo de la naturaleza de su tarea, diferentes formas pueden ser approrpiate:

(1) Como muchos han mencionado, una forma común para una tarea ocasional es simplemente para construcción de un hilo y llame a su inicio() método.

(2) Recuerde que si el hilo de fondo no se detiene, de manera predeterminada evitará que su programa se cierre cuando hayan terminado otros hilos. Es posible que desee llamar a setDaemon (true) en la secuencia para que no tenga este comportamiento. (En las aplicaciones basadas en GUI, por otro lado, generalmente acaba llamando a System.exit() de todos modos, y lo ideal es que inserte en su tarea larga un limpia manera de cerrar.)

(3) Si usted frecuentemente tiene tareas breves para "disparar y olvidar", entonces considere usar el Executors framework disponible desde Java 5 en adelante.

+0

Eso es genial, gracias. – eric2323223

Cuestiones relacionadas