使用观察者模式作为与使用Thread.join相同的通知程序?

时间:2011-06-09 13:30:17

标签: java

是否正在使用连接等待一个Thread完成与使用观察者在线程完成时通知调用线程类相同的内容?

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);
}

3 个答案:

答案 0 :(得分:4)

观察者模式是关于通知其他对象,而不是其他线程。 如果读数已完成,您的ReadContentListener将在阅读主题中通知。 在此期间的原始线程将继续它自己的工作(或完成,如果没有)。

使用Thread.join使原始线程简单地阻塞,直到读取线程结束。 你通常不会直接在.start()之后使用它,但只有在原始线程上还有其他事情要做,这应该与读数并行完成。在.start()之后直接调用此函数(对于效果)相当于在原始线程上执行读取

答案 1 :(得分:1)

不,他们不一样。我说在这个上下文中使用join()并不是一个好的编程习惯 - 为什么要使用Threads呢?您实际上是将异步操作转换为同步操作。

使用Observer模式是异步的,如果你在UI代码中这样做,我将用它来阻止GUI锁定(好吧,也许使用SwingWorker或类似的东西,但原理相同)。

答案 2 :(得分:1)

一般情况下它是相同的,因为在线程中不会再执行任何语句,但有一些要点:

  • join返回时,保证线程完成,但通知观察者线程仍在运行时
  • join之后你在主(或父)线程中,用观察者你在线程即将完成。