Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通知一个线程,另一个线程已经完成了它的执行?_Java_Multithreading - Fatal编程技术网

Java 如何通知一个线程,另一个线程已经完成了它的执行?

Java 如何通知一个线程,另一个线程已经完成了它的执行?,java,multithreading,Java,Multithreading,在使用observer-observable模式时,线程通知有一点让我感到不安。我的意思是,我可以通知我的主线程,工作线程是通过使用观察者可观察模式完成的吗 假设我们有这个接口: interface MyInterface{ void onThreadFinished(Object result); } 假设我们有以下实现Runnable的类: class Task implements Runnable{ MyInterface listener; Task(MyI

在使用observer-observable模式时,线程通知有一点让我感到不安。我的意思是,我可以通知我的主线程,工作线程是通过使用观察者可观察模式完成的吗

假设我们有这个接口:

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

    }
}

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

是的,您将在完成该工作的同一线程上

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

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


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

是的,在执行
任务的线程上执行调用。您是否正在尝试从
任务
中移交一些工作,以便在主线程上执行?对不起,但是您是如何在
静态主
编译中创建
新任务(此))
?也许,您的意思是新任务(new MyMain())
@JanusVarmarken不,我想通知父线程子线程已经完成。我知道我可以在父线程中使用Thread.join(),我只是认为还有另一种通知方式。@AndrewTobilko我并没有编译它,我在问题编辑器中编写了示例代码。@Keselme,你当时写得很准确,但下次请,确保它compilesjoin阻止主线程进一步执行,对吗?但是,如果我希望主线程仍然运行,并且能够响应,并且在工作线程完成时仍然得到通知,该怎么办?@Keselme我想您可能有兴趣查看EventQueue或Android的Looper之类的类。我也认为这个答案对你很有用
mainThread -- start worker thread -- do parallel work -- join -- Continue
                  \                                       /
             Worker thread started--do parallel work--exit thread