所谓的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回调机制,不过如此的主要内容,如果未能解决你的问题,请参考以下文章

JAVA和Android的回调机制

转:一个经典例子让你彻彻底底理解java回调机制

Java回调机制

一个经典例子让你彻彻底底理解java回调机制

一个经典例子让你彻彻底底理解java回调机制

转载一个经典例子让你彻彻底底理解java回调机制