Java回调以及如何获取线程的执行结果

如有错误,敬请指正!

软件模块之间存在调用的接口,从调用方式来看,有同步调用、回调、异步调用这三种方式:

  1. 同步调用是是一种阻塞式调用,调用方要等待被调用方执行完毕返回后才能获取调用的执行结果,是一种单向调用。
  2. 回调是一种双向调用,调用方在执行被调用方后,被调用方会调用被调用方的接口;
  3. 异步调用是一种类似消息或者事件的机制,接口在收到某个消息或发生某事件时,会主动通知客户方,通常使用回调来实现异步调用。

Java回调

先来看一个Java回调以及如何获取线程的执行结果的例子:


import java.util.Date;
import java.util.concurrent.TimeUnit;

public class CallbackDemo {
    public static void main(String[] args) {
        CallbackDemo 雇主 = new CallbackDemo();
        TimeWatcher 观察者 = new TimeWatcher();
        //雇主与观察者建立雇佣关系
        观察者.setCallback(雇主);
        //观察者开始开始工作
        观察者.start();
    }

    public void onCallback(String dateTime) {
        System.out.println("雇主接收到观察者回送的消息:" + dateTime);
    }
}

class TimeWatcher extends Thread {
    private CallbackDemo callback;

    public void setCallback(CallbackDemo callback) {
        this.callback = callback;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                if (callback != null) {
                    //观察者通过调用CallbackDemo对象的onCallback方法回送消息到雇主那里
                    callback.onCallback(new Date().toString());
                }
                TimeUnit.MILLISECONDS.sleep(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

程序运行结果:


程序运行结果截图


在这个例子中,雇主通过调用观察者的setCallback()方法将自己的引用设置到观察者中,观察者持有雇主的引用,这样观察者就能调用雇主的onCallback()方法。这样就形成了回调。

现在来总结一下Java回调的必须要素:
1.雇主类必须有可以被观察者调用的方法A;
2.观察者必须持有可以调用A的对象的引用。

在实际工作中,我们通常将方法A以interface或者内部类的形式来实现,然后把包含有A的类的对象引用传递到观察者中。

Java中的线程的返回值是void,并且是一个异步执行流,所以我们没有直接的方法来获取线程执行后的结果,即不能直接知道线程何时结束,以及合适去获取线程执行任务后的结果。由于回调的存在,我们可以在线程中以回调的方式通知线程的调用者线程的结束时间,并可以将任务的结果通过回调回送到调用者中。

注意:
不要在回调中做耗时过多的操作。

扫描二维码关注公众号,回复: 943115 查看本文章

猜你喜欢

转载自blog.csdn.net/yumeizui8923/article/details/79409668