2011-06-09 16 views
5

¿Está usando una combinación para esperar hasta que un subproceso haya terminado lo mismo que usar un observador para notificar a la clase de subproceso de llamada cuando el subproceso ha finalizado?¿Está usando el patrón de observador como un notificador lo mismo que usar Thread.join?

Using join - 

public class Reader { 

    Thread t = new Thread(new ReadContent()); 
    t.start(); 
    t.join(); 
    System.out.println("Thread has finished"); 

     public class ReadContent() implements Runnable{ 
     } 

     public void run() { 
      readContentURL(); 
     } 
} 

/*****************************************************************************/ 
    Using observer - 


public interface ReadContentListener{ 

    public void contentRead(); 

} 


public class Reader implements ReadContentListener { 

    Thread t = new Thread(new ReadContent(this)); 
    t.start(); 

    pubic void contentRead(){ 
    System.out.println("Thread has finished"); 
    } 

     public class ReadContent implements Runnable{ 

     public ReadContent(ReadContentListener readContentListener) { 
      this.readContentListener = readContentListener; 
     } 

     public void run() { 
      readContentURL(); 
      this.readContentListener.contentRead(); 
     } 
} 


/*************************************************************/ 

    public GenericScreenAnimation(String nextScreen, Thread genericWorkerThread) 
{ 

     this.genericWorkerThread = genericWorkerThread; 
     this.genericWorkerThread.start(); 
     initialise(); 
     try { 
      this.genericWorkerThread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     ScreenController.displayNextScreen(nextScreen); 
} 

Respuesta

1

No, no son lo mismo. Yo diría que usar join() en este contexto no es una buena práctica de programación, ¿por qué usar Threads? Básicamente está convirtiendo lo que es una operación asincrónica en una sincrónica.

Usar el patrón Observer es asíncrono y, si lo haces en código UI, es lo que usaría para evitar que la GUI se bloquee (bueno, tal vez usar un SwingWorker o algo así, pero el mismo principio) .

+0

No veo nada de malo con el uso de join. Cuando se usa correctamente, puede ser absolutamente apropiado. Ahora bien, si una persona simplemente transfiere un hilo ejecutable a un hilo, inicia el hilo y se une inmediatamente a él, entonces sí, eso es incorrecto. –

+0

@John V - tienes toda la razón. No quise decir que usar join() en general es incorrecto. He editado mi respuesta para ser un poco más claro. –

+0

He agregado un código más a la pregunta original - GenericScreenAnimation. El método initialise() pinta una animación GIF mientras se ejecuta genericWorkerThread. Cuando genericWorkerThread finalizó, quiero mostrar una nueva pantalla. Está bien usar .join en este caso? –

1

En general, es el mismo, ya que no hay más sentencias se ejecutarán en el hilo, pero hay puntos:

  • cuando join retornos está garantizado que el hilo terminado, pero al notificar hilo observador disponga de la
  • después de join estás en el hilo principal (o padre), con el observador estás en el hilo que va a terminar.
+0

He agregado un poco más de código a la pregunta original - GenericScreenAnimation. El método initialise() pinta una animación GIF mientras se ejecuta genericWorkerThread. Cuando genericWorkerThread finalizó, quiero mostrar una nueva pantalla. Está bien usar .join en este caso? –

+0

Normalmente prefiero usar observadores en tal caso, estoy de acuerdo con @PhillSacre. Debido a que al usar 'join 'solo bloquea uno de los hilos, y usar el observador es completamente asincrónico. –

4

El patrón del observador se trata de notificar a otros objetos , no a otras cadenas. Su ReadContentListener recibirá una notificación en el hilo de lectura si la lectura ha finalizado. El hilo original durante esto continuará su propio trabajo (o finalice, si no hay ninguno).

Al utilizar Thread.join, el hilo original simplemente se bloquea hasta que finaliza el hilo de lectura. Lo usaría normalmente nunca directamente después de .start(), pero solo si tiene otras cosas que hacer en el subproceso original, lo que debe hacerse en paralelo a la lectura. Llamar esto directamente después de .start() es (para los efectos) equivalente a hacer la lectura en el hilo original.

Cuestiones relacionadas