如何基于回调实现Java的异步调用

  异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用。

  回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法。

  利用回调可以实现Java的异步调用,下面的例子来自网上。

  回调接口: 

public interface CallBack {
  /**
   * 执行回调方法
   * @param objects  将处理后的结果作为参数返回给回调方法
   */
  public void execute(Object... objects );
}

消息的发送者:

/**
 * 这个类相当于你自己
 */
public class Local implements CallBack,Runnable{ 

  private Remote remote; 

  /**
   * 发送出去的消息
   */
  private String message; 

  public Local(Remote remote, String message) {
    super();
    this.remote = remote;
    this.message = message;
  } 

  /**
   * 发送消息
   */
  public void sendMessage()
  {
    /**当前线程的名称**/
    System.out.println(Thread.currentThread().getName());
    /**创建一个新的线程发送消息**/
    Thread thread = new Thread(this);
    thread.start();
    /**当前线程继续执行**/
    System.out.println("Message has been sent by Local~!");
  } 

  /**
   * 发送消息后的回调函数
   */
  public void execute(Object... objects ) {
    /**打印返回的消息**/
    System.out.println(objects[0]);
    /**打印发送消息的线程名称**/
    System.out.println(Thread.currentThread().getName());
    /**中断发送消息的线程**/
    Thread.interrupted();
  } 

  public static void main(String[] args)
  {
    Local local = new Local(new Remote(),"Hello"); 

    local.sendMessage();
  } 

  public void run() {
    remote.executeMessage(message, this); //这相当于给同学打电话,打完电话之后,这个线程就可以去做其他事情了,只不过等到你的同学打回电话给你的时候你要做出响应
  }
}

消息的接收者:

/**
 * 这个类相当于你的同学
 */
public class Remote { 

  /**
   * 处理消息
   * @param msg  接收的消息
   * @param callBack 回调函数处理类
   */
  public void executeMessage(String msg,CallBack callBack)
  {
    /**模拟远程类正在处理其他事情,可能需要花费许多时间**/
    for(int i=0;i<1000000000;i++)
    { 

    }
    /**处理完其他事情,现在来处理消息**/
    System.out.println(msg);
    System.out.println("I hava executed the message by Local");
    /**执行回调**/
    callBack.execute(new String[]{"Nice to meet you~!"}); //这相当于同学执行完之后打电话给你
  } 

}

这样就可以基于回调实现异步调用,当消息接受者处理任务完成后去调用消息发送者的方法。

异步调用的类似实现,当图片加载的比较慢时,可以先加载一张模糊的图片,当图片加载完成后再去进行局部的刷新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 具体说来:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法, 实例1:使用java中Timer来在给定时间间隔发送通知,每隔十秒打印一次数据 Tim

  • Java8新的异步编程方式CompletableFuture实现

    一. Future JDK 5引入了Future模式.Future接口是Java多线程Future模式的实现,在java.util.concurrent包中,可以来进行异步计算. Future模式是多线程设计常用的一种设计模式.Future模式可以理解成:我有一个任务,提交给了Future,Future替我完成这个任务.期间我自己可以去做任何想做的事情.一段时间之后,我就便可以从Future那儿取出结果. Future的接口很简单,只有五个方法. public interface Future<

  • Java接口异步调用

    前言 java接口调用从调用方式上可以分为3类:同步调用,异步调用,回调:同步调用基本不用说了,它是一种阻塞式的调用,就是A方法中直接调用方法B,从上往下依次执行.今天来说说异步调用. 什么是异步调用? 我的理解就是在方法A中调用方法B,但是方法B很耗时,如果是同步调用的话会等方法B执行完成后才往下执行,如果异步的话就是我调用了方法B,它给我个返回值证明它已接受调用,但是它并没有完成任务,而我就继续往下执行.可能有表达不当的地方,欢迎指正. 再用一个生活中的例子吧: 异步调用就是你 喊 你朋友吃

  • JAVA实现异步调用实例代码

    在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据. 在调用一个方法的时候,程序会进入被调用方法体内,执行完这个被调用方法后,才返回执行下一条语句.怎么做到像ajax异步请求一样,发送请求后,没等请求响应就执行下一条语句呢?对于java的异步请求,找了许多教材都没有找到,如thinking in java.core java2 ......等等.受多线程

  • Java多线程实现异步调用的方法

    在JAVA平台,实现异步调用的角色有如下三个角色:调用者 提货单   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获取真正的数据. 去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,再拿提货单取蛋糕就可以了. public class Main { public static void main(String[] args) { System.out.println("ma

  • Android上传多张图片的实例代码(RxJava异步分发)

    学习RxJava有一段时间了,一直在考虑怎么使用,如何在项目中合理运用它.在android很多项目中,都会存在图片上传,下面我介绍如何用Rxjava异步上传多张图片. 一,用到的框架 compile 'top.zibin:Luban:1.0.9'//图片压缩 compile 'org.xutils:xutils:3.3.34'//网络请求 compile 'io.reactivex:rxandroid:1.1.0'//rxandroid compile 'io.reactivex:rxjava:

  • Java异步调用转同步方法实例详解

    先说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步.换句话说,就是需要在异步 调用过程中,持续阻塞至获得调用结果. 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法 使用条件锁 Future 使用CountDownLatch 使用CyclicBarri

  • 如何基于回调实现Java的异步调用

    异步是指调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通知调用者,或通过回调函数处理这个调用. 回调简单地说就是B中有一个A,这样A在调用B的某个方法时实际上是调用到了自己的方法. 利用回调可以实现Java的异步调用,下面的例子来自网上. 回调接口: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... object

  • Java多线程异步调用性能调优方法详解

    目录 概述 同步调用和异步调用 Future类图 Future的不足 代码 代码地址 Test PaymentService CheckService OrderService 总结 概述 大型电商公司的支付聚合服务都有这类的场景: 调用校验服务校验待生成的订单是否合法 订单服务生成订单(校验服务和订单服务没有依赖关系) 调用1和2,支付服务实现支付核心的功能 结合步骤1至3完成支付服务的聚合调用 ​假如步骤1的耗时5秒,步骤2的耗时3秒,步骤3的耗时2秒,如果你是架构师,要求:​ 1.请实现微

  • 关于java中@Async异步调用详细解析附代码

    目录 前言 1. @Async讲解 2. 用法 2.1 同步调用 2.2 异步调用 3. 自定义线程池 前言 异步调用与同步调用 同步调用:顺序执行,通过调用返回结果再次执行下一个调用 异步调用:通过调用,无需等待返回结果,执行下一个调用 1. @Async讲解 其@Async的注解代码如下: @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public

  • 5种必会的Java异步调用转同步的方法你会几种

    Sunny先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步.换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果. 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法 使用条件锁 Future 使用CountDownLatch 使用Cyclic

  • Java异步调用转同步的方法

    先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步.换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果. 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法 使用条件锁 Future 使用CountDownLatch 使用CyclicBarri

  • 说说Java异步调用的几种方式

    目录 一.通过创建新线程 二.通过线程池 三.通过@Async注解 四.通过CompletableFuture 日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结果就对原服务进行返回.这里就涉及的Java异步调用的一个知识.下面本文尝试将Java异步调用的多种方式进行归纳. 一.通过创建新线程 首先的我们得认识到,异步调用的本质,其实是通过开启一个新的线程来执行.如以下例子: public static void main(String[] args)

随机推荐