Java回调以及如何获取线程的执行结果
2018-03-01 11:01
465 查看
如有错误,敬请指正!
软件模块之间存在调用的接口,从调用方式来看,有同步调用、回调、异步调用这三种方式:
同步调用是是一种阻塞式调用,调用方要等待被调用方执行完毕返回后才能获取调用的执行结果,是一种单向调用。
回调是一种双向调用,调用方在执行被调用方后,被调用方会调用被调用方的接口;
异步调用是一种类似消息或者事件的机制,接口在收到某个消息或发生某事件时,会主动通知客户方,通常使用回调来实现异步调用。
Java回调
先来看一个Java回调以及如何获取线程的执行结果的例子:
程序运行结果:
![](https://img-blog.csdn.net/20180301105716795?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVtZWl6dWk4OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
在这个例子中,雇主通过调用观察者的setCallback()方法将自己的引用设置到观察者中,观察者持有雇主的引用,这样观察者就能调用雇主的onCallback()方法。这样就形成了回调。
现在来总结一下Java回调的必须要素:
1.雇主类必须有可以被观察者调用的方法A;
2.观察者必须持有可以调用A的对象的引用。
在实际工作中,我们通常将方法A以interface或者内部类的形式来实现,然后把包含有A的类的对象引用传递到观察者中。
Java中的线程的返回值是void,并且是一个异步执行流,所以我们没有直接的方法来获取线程执行后的结果,即不能直接知道线程何时结束,以及合适去获取线程执行任务后的结果。由于回调的存在,我们可以在线程中以回调的方式通知线程的调用者线程的结束时间,并可以将任务的结果通过回调回送到调用者中。
注意:
不要在回调中做耗时过多的操作。
软件模块之间存在调用的接口,从调用方式来看,有同步调用、回调、异步调用这三种方式:
同步调用是是一种阻塞式调用,调用方要等待被调用方执行完毕返回后才能获取调用的执行结果,是一种单向调用。
回调是一种双向调用,调用方在执行被调用方后,被调用方会调用被调用方的接口;
异步调用是一种类似消息或者事件的机制,接口在收到某个消息或发生某事件时,会主动通知客户方,通常使用回调来实现异步调用。
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,并且是一个异步执行流,所以我们没有直接的方法来获取线程执行后的结果,即不能直接知道线程何时结束,以及合适去获取线程执行任务后的结果。由于回调的存在,我们可以在线程中以回调的方式通知线程的调用者线程的结束时间,并可以将任务的结果通过回调回送到调用者中。
注意:
不要在回调中做耗时过多的操作。
相关文章推荐
- 如何在java中获取线程异步执行之后的结果
- java 多线程,及获取线程执行结果
- 【多线程】——Runnable如何获取线程执行结果?
- Java中使用Future获取线程异步执行结果的使用
- Java并发编程的艺术(九)——批量获取多条线程的执行结果
- java面试-Java并发编程(九)——批量获取多条线程的执行结果
- java并发:获取线程执行结果(Callable、Future、FutureTask)
- java 中多线程和锁的使用以及获取多线程执行结果
- Java乔晓松-Android SD卡路径问题以及如何获取SDCard内存大小
- Java如何等待子线程执行结束
- JDK5 如何获取所有线程池的结果再继续执行
- 判断一个线程是否执行结束以及获取线程退出码
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件
- 如何在java code 中获取 dbms_output 的结果
- 转载:C程序中如何获取命令执行的结果
- java如何获取SQL查询结果集中的行数和列数
- 手把手教你如何把java代码,打包成jar文件以及转换为exe可执行文件