所谓的Java回调机制,不过如此
Posted 姓chen的大键哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了所谓的Java回调机制,不过如此相关的知识,希望对你有一定的参考价值。
在一个应用系统必然存在模块间的相互调用(无论是什么语言实现的),模块间调用分为以下几种:
文章目录
同步调用
同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等待b()方法执行完毕,a()方法继续往下走。
原理图如下所示:
这种调用方式适合b()方法执行时间不长的情况,若b()方法执行时间太长,则会导致a()方法中余下的代码无法执行,这样会使整个流程阻塞。
异步调用
异步调用是为了解决同步调用可能出现阻塞,导致整个流程卡住而产生的一种调用方式。类A的方法方法a()通过新起线程的方式调用类B的方法b(),代码接着直接往下执行,这样无论方法b()执行时间多久,都不会阻塞住方法a()的执行。
原理图如下:
如果方法a()需要b()方法的执行结果,那还需要设置额外的监听方法对b()方法执行结果进行监听,在Java多线程编程中,可以使用Future+Callable的方式做到这一点。
回调
回调的思想是类A的a()方法调用类B的b()方法,当b()方法执行完之后主动调用类A的callback()方法。
原理图如下:
回调分为同步回调和异步回调。回调是一种思想、是一种机制,其核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后告诉回调方它想要知道的信息。
同步回调
具体写法如下:
//回调接口
public interface CallbackListener
void callBack(String msg);
//回调接口实现类
public class A implements CallbackListener
public A()
B b = new B();
b.b(this);
System.out.println("我调用了B类的b()方法");
/** 实现接口 */
public void callBack(String str)
System.out.println(str);
//调用类
public class B
public void b(CallbackListenter callBack)
System.out.println("我被调用了");
callBack.callBack("调用回调方法");
//主程序
public class Main
public static void main(String[] args)
new A();
从上面的代码可以看出同步回调实现其实很简单,再细心一看,会发现同步回调机制跟同步调用执行顺序是一样的,所以同步回调机制是同步调用的其中一种实现。
异步调用
不同于同步调用,异步调用在新线程中进行调用,执行完成之后再调用回调方法。相关代码如下:
//回调接口
public interface CallbackListener
void callBack(String msg);
//回调接口实现类
public class A implements CallbackListener
public A()
B b = new B();
b.b(this);
System.out.println("我调用了B类的b()方法");
/** 实现接口 */
public void callBack(String str)
System.out.println(str);
//调用类
public class B
public void b(CallbackListenter callBack)
Thread thread = new Thread()
@Override
public void run()
try
sleep(2000);
System.out.println("我被调用了");
callBack.callBack("调用回调方法");
catch (InterruptedException e)
e.printStackTrace();
;
thread.start();
//主程序
public class Main
public static void main(String[] args)
new A();
异步回调与同步回调最大的区别就是异步回调多开了新线程来执行。
回调的概念其实不难,难在怎么在设计中灵活的运用
以上是关于所谓的Java回调机制,不过如此的主要内容,如果未能解决你的问题,请参考以下文章