总结一下Java回调机制的相关知识

一、回调

回调分为同步回调和异步回调, 假如以买彩票的场景来模拟, 我买彩票, 调用彩票网,给我返回的结果确定是否中奖,同步回调就是,我买了彩票之后, 需要等待彩票网给我返回的结果, 这个时候我不能做其他事情, 我必须等待这个结果, 这就叫同步回调, 同步, 就意味着等待, 我不能去做其他事情, 必须等待, 异步回调就是, 我买了彩票之后, 可以去做其他事情, 然后当彩票网有了结果和消息, 再给我返回消息, 其中最明显的方式就是在得到彩票结果的函数之中, 添加一个其他的方法, 如果我的其他方法可以立即执行, 那么就是异步的(给出是否中奖需要花费很长的时间), 而在测试函数之中, 前后两个, 那是发生在测试函数的线程之中的, 肯定是一前一后按照次序的, 在这个地方不是显示同步异步的地点.

即我调用你的函数,你调用我的函数。通俗讲是类A的函数a()调用类B的函数b(),当类B的b()函数的执行时又去调用类A里的函数a1()。是一种双向的调用方式。一般情况下,回调分两种,分别是同步回调异步回调

二、同步回调

一种双向的调用模式,被调用方在函数被调用时也会调用对方的函数,中间不做其他操作。

例如:其中CalImp属于类A,CalLogin属于类B。

public interface ICallBack {
    public void calResult(int a,int b,int result);
}

public class CalImpl implements ICallBack{

    private int a;
    private int b;

    public CalImpl(int a, int b){
        this.a = a;
        this.b = b;
    }

    public void calculate(){
       new CalLogic().calculateLogic(a,b,this);
    }

    @Override
    public void calResult(int a, int b, int result) {
        //控制台输出
        System.out.println(a + " + " + b + " = " + result);
    }
}

public class CalLogic {

    public void calculateLogic(int a,int b,ICallBack iCallBack){
        int result = a + b;
        System.out.println("被调用线程执行完成...");
        iCallBack.calResult(a, b, result);
    }

}

public class TestCallBack {

    public static void main(String[] args) {
        int a = 22;
        int b = 33;
        //实例化计算器Calculator类
        CalImpl calculator = new CalImpl(a,b);
        //调用计算器calculator的计算函数
        calculator.calculate();
        System.out.println("主线程执行完成...");

        //22 + 33 = 55
        //主线程执行完成...
    }
}

三、异步回调

一种类似消息或事件的机制。被调用方函数在收到某种讯息或发生某种事件(完成某个操作)时,才去调用对方的函数,即通过异步消息进行通知

简单来说,类A的a()函数调用类B的b()函数,但是b()函数很耗时,不确定什么时候执行完毕,如果是同步调用的话会等b()执行完成后才往下执行回调类A中的函数,如果是异步回调的话调用了b()函数,虽然b()函数没有执行完,但a类仍然继续往下执行,为了完成这点,就需要另开一个线程了。

例如:其中CalImp属于类A,CalLogin属于类B。类A中新开了一个线程执行。

输出主线程执行完成...明明是放在代码的最后执行的,结果却先执行输出了,这是因为开了另一个线程。

四、同步异步回调区别

异步回调和同步回调最大的不同就是:异步回调里新建了一个子线程。

五、异步场景

异步回调常见于请求服务器数据,当取到数据时,会进行回调。

到此这篇关于总结一下Java回调机制相关知识的文章就介绍到这了,更多相关Java回调机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 深入了解Java接口回调机制

    一.前言 最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如 A通知 B后,他们各走各的路,互不影响,不用像同步调用那样, A

  • Java回调函数与观察者模式实例代码

    本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下. 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 什么时候使用观察者模式: 当一个抽象模型有两个方面, 其中一个方面依

  • Java的回调机制实例详解

    本文实例讲述了Java的回调机制.分享给大家供大家参考,具体如下: 一 代码 interface CallBack // 回调接口 { void methodToCallBack( ); //回调方法 } class CallBackImpl implements CallBack // 实现回调接口和回调方法 { public void methodToCallBack( ) { System.out.println("I've been called back"); } } pub

  • Java中的接口回调实例

    定义: /** * @author Administrator * @project: TestOne * @package: PACKAGE_NAME * @date: 2018/11/30 0030 15:42 * @brief: 郭宝 **/ public class Person { /** * 自定义一个接口 **/ public interface OnNameChangeListener{ //接口中的抽象函数,并携带数据 void onNameChange(String name

  • Java中的回调

    又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了). 这次我们来谈一谈Java里的一个很有意思的东西--回调. 什么叫回调,一本正经的来讲,在计算机程序设计中,回调函数是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 别急别急,且听我慢慢道来. 举个栗子,设置这样一个情景,老板安排员工做事,然后让他做完后跟他电话说一声.老板当然不会在那里一直等员工做完事情才去做其他事,而是只交代完任务就去忙自己的事情了. 这个例子包

  • 总结一下Java回调机制的相关知识

    一.回调 回调分为同步回调和异步回调, 假如以买彩票的场景来模拟, 我买彩票, 调用彩票网,给我返回的结果确定是否中奖,同步回调就是,我买了彩票之后, 需要等待彩票网给我返回的结果, 这个时候我不能做其他事情, 我必须等待这个结果, 这就叫同步回调, 同步, 就意味着等待, 我不能去做其他事情, 必须等待, 异步回调就是, 我买了彩票之后, 可以去做其他事情, 然后当彩票网有了结果和消息, 再给我返回消息, 其中最明显的方式就是在得到彩票结果的函数之中, 添加一个其他的方法, 如果我的其他方法可

  • Java 回调机制(CallBack) 详解及实例代码

     Java 回调机制 概要: 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师

  • java 回调机制的实例详解

    java 回调机制的实例详解 序言 最近接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上

  • Java基础之并发相关知识总结

    一.Java并发是什么? 用学术定义来说就是 并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行): 简单来说就是,同一个时间段,让计算机同时做多个事情. 说到并发,不得不提就是并行: 并行:单位时间内,多个任务同时执行. 两者大眼一看很像,仔细一想却并不相同,因为并行强调某个时间点多个任务同时执行,而并发强调的是一个时间段内多个任务都在执行. 二.怎么做? 大部分并发问题,最终都可以抽象成三类问题分工.同步和互斥.而且针对不同的问题有着不同的方式来解决,具体如下图所示: 三.分工

  • java回调机制实例详解

    java回调机制实例详解 以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 clas

  • java中数组的相关知识小结(推荐)

    1. 2.数组的命名方法 1)int[]ages=new int[5]; 2) int[]ages; ages=new int[5]; 3)int[]ags={1,2,3,4,5}; 4)int[]ags; ags=new int{1,2,3,4}; 或者 int[]ags=new int{1,2,3,4}; 3.java不支持不同类型的重名数组 4.java中数组的循环赋值 package dierge; public class Shuzu { public static void main

  • 通过简易例子讲解Java回调机制

    这篇文章主要介绍了通过简易例子讲解Java回调机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先说点题外话.为什么要写这篇文章,因为在看J.U.C包的FutureTask源码的时候,有一个done()方法,这是个抽象方法,用户实现它之后,FutureTask会在执行完后调用这个方法.这就是回调机制,回调的思想就是: 类A调用类B的b方法 类B的b方法执行完毕主动调用类A的callback()方法 给出思想过于抽象,所以我会举出一个简单的实

  • Java基础之引用相关知识总结

    一.引用的定义 在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用. 二.问题 当描述这样的一类对象:当内存空间还足够时,则能保留在内存之中,如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象.此时的引用就显得过于狭隘.因此在JDK 1.2之后,Java堆引用的概念进行了扩充. 三.引用的分类 回收时机 强引用 Strong Reference 类似Object obj = new Ob

  • Java数据结构之链表相关知识总结

    一.链表 1.1 概述 链表是真正动态的数据结构,最简单的动态数据结构,基本用于辅助组成其他数据结构. 数据存储在"节点"(Node)中 优点:真正的动态,不需要处理固定容量的问题 缺点:丧失了随机访问的能力 1.2 链表使用的基本功能 定义Node节点 private class Node{ public E e; public Node next; public Node(E e, Node next){ this.e = e; this.next = next; } public

  • Java数组与堆栈相关知识总结

    一.数组创建 1.1 声明并赋值 int[] a = {1,2,3}; 1.2 声明数组名开辟空间并且赋值 int[] a; a = new int[]{1,2,3}; 1.3 声明数组时指定元素个数然后赋值 int[] a= new int[3]; 这里Java会默认数组元素值为0 1.4 在以上的基础上创建多维数组 int[][] a = {{1,2,3},{4,5,6},{7,8,9}}; //每个子数组元素个数不要求均相同 int[][] a = new int[m][n]; //其中n

随机推荐