2010-04-20 18 views
14

Tengo una función que necesita realizar dos operaciones, una que finaliza rápido y otra que tarda mucho tiempo en ejecutarse. Quiero poder delegar la operación de larga ejecución en un hilo y no me importa cuándo finaliza el hilo, pero los hilos deben completarse. Implementé esto como se muestra a continuación, pero mi operación secundaria nunca se realiza cuando la función sale después de la llamada a start(). ¿Cómo puedo asegurar que la función retorna pero el segundo hilo de operación también termina su ejecución y no depende del hilo padre?¿Cómo se implementa un hilo Java verdaderamente asíncrono?

public void someFunction(String data) 
{ 
    smallOperation() 
    SecondOperation a = new SecondOperation(); 
    Thread th = new Thread(a); 
    th.Start(); 
} 

class SecondOperation implements Runnable 
{ 
    public void run(){ 
    // doSomething long running 
} 
} 
+2

Nunca utiliza 'SecondOperation' en su' someFunction() ', ¿cómo espera que se ejecute? –

+0

incluso te falta un punto y coma: -/ – fortran

+0

Disculpa, solucionó el error en mi código. –

Respuesta

35
public void someFunction(final String data) { 
    shortOperation(data); 
    new Thread(new Runnable() { 
     public void run(){ 
      longOperation(data); 
     } 
    }).start(); 
} 

Si someFunction se llama, la JVM se ejecutará la longOperation si

  1. el hilo conductor no está marcado como demonio (en el código anterior se no lo es)
  2. el longOperation() no arroja una excepción y
  3. no hay llamadas a System.exit() se realiza en longOperation()
1

La JVM no saldrá antes de que finalice la secuencia. Este código que publicaste ni siquiera compila; tal vez el problema está en tu código real.

+0

He escrito solo la parte lógica del código. –

+0

No tengo idea de lo que quiere decir con "la parte lógica", pero el código que ha proporcionado no es la parte que está causando que termine su subproceso. – danben

1

SI su segunda función no se realiza, no tiene nada que ver con el retorno de su función. Si algo llama al System.exit() o si su función arroja una excepción, el hilo se detendrá. De lo contrario, se ejecutará hasta que se complete, incluso si el hilo principal se detiene. Eso puede evitarse configurando el nuevo hilo para que sea un daemon, pero no lo está haciendo aquí.

+0

¿Cómo configuro el nuevo hilo como daemon? –

+0

Para que quede claro, establecerlo en un daemon causará que la JVM salga antes de que finalice si no se están ejecutando otras hebras no daemon. Entonces es lo opuesto a lo que quieres. Lo configura llamando a setDaemon (true) en el objeto Thread * antes * de llamar a start(). – Yishai

0

Crea un hilo asincrónico real creando un segundo hilo dentro de un hilo temporal.

(new Thread(new Runnable() { public void run() { 
    (new Thread(new Runnable() { public void run() 
    { 
     /* async thread */ 
    }})).start(); 
}})).start();