【问题标题】:How to notify a thread, that another thread has finished its execution?如何通知一个线程,另一个线程已完成执行?
【发布时间】:2018-07-30 19:07:18
【问题描述】:

在使用观察者可观察模式时,线程通知有一些让我有些困扰的地方。我的意思是,我可以通知我的主线程工作线程是通过使用观察者可观察模式完成的吗?

假设我们有这个接口:

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 类的接口实现中发生的一切仍然在线程上运行。我在这里是正确的还是遗漏了什么?

【问题讨论】:

  • 是的,调用是在执行Task runnable 的线程上执行的。您是否要从Task 交出一些工作以在主线程上执行?
  • 抱歉,您是如何使new Task(this)) 中的static main 编译的?也许,你的意思是new Task(new MyMain())
  • @JanusVarmarken 不,我想通知父线程子线程已完成。我知道我可以在父线程中使用 Thread.join() ,我只是认为还可以有另一种通知方式。
  • @AndrewTobilko 我并没有真正编译它,我在问题编辑器中编写了示例代码。
  • @Keselme,那么你是一个准确的作家,但下一次,请确保它编译

标签: java multithreading


【解决方案1】:

是的,您将在完成这项工作的同一线程上。

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

是这样的(请原谅可怕的 ascii 艺术):

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

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

【讨论】:

  • join 会阻止主线程进一步执行,对吗?但是,如果我希望主线程仍然运行并做出响应,并且在工作线程完成时仍然收到通知,该怎么办?
  • @Keselme 我想您可能有兴趣查看 EventQueue 或 Android 的 Looper 等类。我也认为这个答案stackoverflow.com/questions/7597742/…对你有用
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 2012-12-29
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多