模块间挪用
在一个应用系统中,无论利用何种语言开拓,一定存在模块之间的挪用,挪用的方法分为几种:
(1)同法式用
同法式用是最根基而且最简朴的一种挪用方法,软件开发,类A的要领a()挪用类B的要领b(),一直期待b()要领执行完毕,a()要领继承往下走。这种挪用方法合用于要领b()执行时间不长的环境,因为b()要领执行时间一长可能直接阻塞的话,a()要领的余下代码是无法执行下去的,这样会造成整个流程的阻塞。
(2)异法式用
异法式用是为了办理同法式用大概呈现阻塞,导致整个流程卡住而发生的一种挪用方法。类A的要领要领a()通过新起线程的方法挪用类B的要领b(),代码接着直接往下执行,这样无论要领b()执行时间多久,都不会阻塞住要领a()的执行。可是这种方法,由于要领a()不期待要领b()的执行完成,在要领a()需要要领b()执行功效的环境下(视详细业务而定,有些业务好比启异步线程发个微信通知、刷新一个缓存这种就没须要),必需通过必然的方法对要领b()的执行功效举办监听。在Java中,可以利用Future+Callable的方法做到这一点,详细做法可以拜见我的这篇文章Java多线程21:多线程下其他组件之CyclicBarrier、Callable、Future和FutureTask。
(3)回调
最后是回调,回调的思想是:
这样一种挪用方法构成了上图,也就是一种双向的挪用方法。
代码示例
接下来看一下回调的代码示例,代码模仿的是这样一种场景:老师问学生问题,学生思考完毕答复老师。
首先界说一个回调接口,只有一个要领tellAnswer(int answer),即学生思考完毕汇报老师谜底:
/** * 回调接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public interface Callback { public void tellAnswer(int answer); }
界说一个老师工具,实现Callback接口:
/** * 老师工具,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class Teacher implements Callback { private Student student; public Teacher(Student student) { this.student = student; } public void askQuestion() { student.resolveQuestion(this); } @Override public void tellAnswer(int answer) { System.out.println("知道了,你的谜底是" + answer); } }
老师工具有两个public要领:
(1)回调接口tellAnswer(int answer),即学生答复完毕问题之后,老师要做的工作
(2)问问题要领askQuestion(),即向学生问问题
接着界说一个学生接口,学生虽然是办理问题,可是吸收一个Callback参数,这样学生就知道办理完毕问题向谁陈诉:
/** * 学生接口,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public interface Student { public void resolveQuestion(Callback callback); }
最后界说一个详细的学生叫Ricky:
/** * 一个名叫Ricky的同学办理老师提出的问题,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class Ricky implements Student { @Override public void resolveQuestion(Callback callback) { // 模仿办理问题 try { Thread.sleep(3000); } catch (InterruptedException e) { } // 回调,汇报老师功课写了多久 callback.tellAnswer(3); } }
在办理完毕问题之后,第16行向老师陈诉谜底。
写一个测试类,较量简朴:
/** * 回调测试,原文出处http://www.cnblogs.com/xrq730/p/6424471.html */ public class CallbackTest { @Test public void testCallback() { Student student = new Ricky(); Teacher teacher = new Teacher(student); teacher.askQuestion(); } }
代码运行功效就一行:
知道了,你的谜底是3
简朴总结、阐明一下这个例子就是:
(1)老师挪用学生接口的要领resolveQuestion,向学生提问
(2)学生办理完毕问题之后挪用老师的回调要领tellAnswer
这样一套流程,组成了一种双向挪用的干系。
代码阐明
阐明一下上面的代码,上面的代码我这里做了两层的抽象:
(1)将老师举办抽象