如何通知一个线程,另一个线程已完成执行?

时间:2018-07-30 19:07:18

标签: java multithreading

使用观察者可观察的模式时,关于线程通知的事情有些困扰我。我的意思是,我可以使用观察者可观察的模式通知主线程该工作线程已完成吗?

假设我们有此界面:

interface MyInterface{

    void onThreadFinished(Object result);
}

假设我们有以下实现Runnable的类:

class Task implements Runnable{

   MyInterface listener;

   Task(MyInterface listener){
      this.listener = listener;
   }

   public void run(){
      Object result = new Object();
      try{
          //do some work on result here
      }
      finally{
          listener.onThreadFinished(result);
      }    

   }
}

现在退出主线程:

class MyMain implements MyInterface{

    public void onThreadFinished(Object result){
        //Do something with the result
    }

    public static void main(String args[]){

      Task myTask = new Task(this);
      Thread thread = new Thread(myTask);
      thread.start();

    }
}

现在,我的问题是,当我从finally块调用 listener.onThreadFinished(result); 时,我仍然处于run()方法中,这意味着工作线程尚未完成,因此MyMain类中接口实现中发生的所有事情仍然在线程上运行。我在这里正确还是丢失了什么?

1 个答案:

答案 0 :(得分:1)

是的,您将处于与工作相同的线程上。

如果您不想在该线程中运行(如果您希望工作完成后让原始线程“恢复”),请改用Thread.join。

是这样的(请原谅飞速Ascii艺术的可怕之处):

mainThread -- start worker thread -- do parallel work -- join -- Continue
                  \                                       /
             Worker thread started--do parallel work--exit thread

最后(“继续”)将确保工作线程已完全完成。