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