Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >java 中的异步回调

java 中的异步回调

作者头像
菩提树下的杨过
发布于 2018-01-18 09:37:37
发布于 2018-01-18 09:37:37
3.3K00
代码可运行
举报
运行总次数:0
代码可运行

异步回调,本来在c#中是一件极为简单和优雅的事情,想不到在java的世界里,却如此烦琐,先看下类图:

先定义了一个CallBackTask,做为外层的面子工程,其主要工作为start 开始一个异步操作,然而真正干活的是CallBackBody,它里面的execute才是真正要处理的事情,如果成功,则触发onSucess,否则触发onFailure。

CallBackApp做为最终的运行舞台,这里面还得单独跑一个线程,来启动CallBackTask,这样才不会阻塞后面的处理。

CallBackBody:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cnblogs.yjmyzz.test.callback;


public abstract class CallBackBody {

    void onSuccess(Object context) {
        System.out.println("onSuccess");
    }

    void onFailure(Object context) {
        System.out.println("onFailure");
    }

    abstract void execute(Object context) throws Exception;
}

CallBackTask:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cnblogs.yjmyzz.test.callback;

public class CallBackTask {
    private CallBackBody body;

    public CallBackTask(CallBackBody body) {
        this.body = body;
    }

    protected void start(final Object context) {
        final Thread t = new Thread(new Runnable() {
            public void run() {
                try {
                    body.execute(context);
                } catch (Exception e) {
                    e.printStackTrace();
                    body.onFailure(context);
                }
                body.onSuccess(context);
            }
        });
        t.start();
    }
}

最后测试一把:

CallBackApp:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.cnblogs.yjmyzz.test.callback;


/**
 * Created by jimmy on 8/13/15.
 */
public class CallBackApp {

    public static void main(String[] args) {

        System.out.println("准备开始执行异步任务...");

        final Object context = "上下文信息";

        new CallBackTask(new CallBackBody() {
            @Override
            void execute(Object context) throws Exception {
                System.out.println("\n正在执行耗时操作...");
                System.out.println(context);
                Thread.sleep(5000);
                System.out.println("\n执行完成!");
            }

            void onSuccess(Object context) {
                System.out.println("\n成功后的回调函数...");
                System.out.println(context);
            }

            void onFailure(Object context) {
                System.out.println("\n失败后的回调函数...");
                System.out.println(context);
            }
        }).start(context);

        System.out.println("\n异步任务已经开始,请等待完成...");
    }
}

运行结果:

准备开始执行异步任务... 正在执行耗时操作... 上下文信息 异步任务已经开始,请等待完成... 执行完成! 成功后的回调函数... 上下文信息

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
异步编程的几种方式,你知道几种?
异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间。
田维常
2023/08/31
3540
异步编程的几种方式,你知道几种?
软件设计中的异步思想与实践
程序或系统中关于异步的概念使用的比较多,那么什么是异步呢?下面举个生活中最常见的情景来进行说明:
topgunviper
2022/05/12
4710
软件设计中的异步思想与实践
JUC线程池扩展可回调的Future
最近在看JUC线程池java.util.concurrent.ThreadPoolExecutor的源码实现,其中了解到java.util.concurrent.Future的实现原理。从目前java.util.concurrent.Future的实现来看,虽然实现了异步提交任务,但是任务结果的获取过程需要主动调用Future#get()或者Future#get(long timeout, TimeUnit unit),而前者是阻塞的,后者在异步任务执行时间不确定的情况下有可能需要进行轮询,这两种情况和异步调用的初衷有点相违背。于是笔者想结合目前了解到的Future实现原理的前提下扩展出支持(监听)回调的Future,思路上参考了Guava增强的ListenableFuture。本文编写的时候使用的JDK是JDK11,代码可以在JDK[8,12]版本上运行,其他版本可能不适合。
Throwable
2020/06/23
8180
实现java的异步回调
说下java的异步回调模式,是指当调用者实现了CallBack接口,调用者包含了被调用者的引用,在调用者类中调用被调用者的方法,然后在被调用者类的方法中调用调用者类的callBack方法。
码农王同学
2020/04/08
4.7K0
实现java的异步回调
Guava——扩展原生JDK线程
当要使用线程去执行一个任务时,可以使用ExecutorService.submit(new Callable());
黑洞代码
2021/01/14
1.4K0
异步编程 - 10 Web Servlet的异步非阻塞处理
我们这里主要讨论Servlet3.0规范前的同步处理模型和缺点,Servlet3.0规范提供的异步处理能力与Servlet3.1规范提供的非阻塞IO能力,以及Spring MVC中提供的异步处理能力。
小小工匠
2023/09/09
8490
异步编程 - 10 Web Servlet的异步非阻塞处理
Java线程的基本使用
在Java中使用多线程,本质上还是对Thread对象的操作。线程池只是为了方便对线程的管理,避免频繁的创建和销毁线程带来不必要的系统开销,内部通过指定的线程数和阻塞队列实现。
spilledyear
2019/12/24
5950
笑了,面试官问我知不知道异步编程的Future。
文本主要分享这个 future 的调用方式,不讲 Dubbo 框架,这里只是一个引子。
why技术
2020/08/13
4520
笑了,面试官问我知不知道异步编程的Future。
netty的Future异步回调难理解?手写个带回调异步框架就懂了
本文首发于京东零售公众号,https://mp.weixin.qq.com/s/17OAAbCKQND-AjTdf43TGw
天涯泪小武
2020/02/13
3.9K0
CompletableFuture异步回调
  Future模式是高并发设计与开发过程中常见的设计模式,它的核心思想是异步调用。对于Future模式来说,它不是立即返回我们所需要的数据,但是它会返回一个契约(或异步任务),将来我们可以凭借这个契约(或异步任务)获取需要的结果。
别团等shy哥发育
2023/10/17
5040
CompletableFuture异步回调
漫谈并发编程:Future模型(Java、Clojure、Scala多语言角度分析)
0x00 前言 其实Future模型离我们并不远,如果你接触过Spark、Hadoop这些优秀的开源项目,那么在运行程序的时候关注一下他们的输出日志,一不小心你就会发现Future的身影。 在并发编程领域有很多优秀的设计模式,比如常见的Producer-Consumer模式、Pipeline模式和Future模式,这些模式都有其适用的场景,并且能够高效地解决并发问题。 这篇文章会着重分享和Future模式相关的一些知识点。 文章结构 本文的结构如下: 先解释一下什么是Future模型 Java不可避免
木东居士
2018/05/25
1.9K0
spring中的多线程aop方法拦截
日常开发中,常用spring的aop机制来拦截方法,记点日志、执行结果、方法执行时间啥的,很是方便,比如下面这样:(以spring-boot项目为例)
菩提树下的杨过
2018/10/10
2.1K0
如何在SpringBoot中异步请求和异步调用
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
架构师修炼
2020/07/20
2.1K0
如何在SpringBoot中异步请求和异步调用
深入解析OkHttp3
OkHttp是一个精巧的网络请求库,有如下特性: 1)支持http2,对一台机器的所有请求共享同一个socket 2)内置连接池,支持连接复用,减少延迟 3)支持透明的gzip压缩响应体 4)通过缓存避免重复的请求 5)请求失败时自动重试主机的其他ip,自动重定向 6)好用的API
老马的编程之旅
2022/06/22
3.2K0
深入解析OkHttp3
Java 异步调用实践
当用户进程调用了recvfrom 这个系统调用,kernel 就开始了 IO 的第一个阶段:准备数据。对于 network io 来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候 kernel 就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当 kernel 一直等到数据准备好了,它就会将数据从 kernel 中拷贝到用户内存,然后 kernel 返回结果,用户进程才解除 block 的状态,重新运行起来。所以,Blocking IO 的特点就是在 IO 执行的两个阶段都被 block 了。
PPPHUANG
2022/07/30
4.9K0
Java 异步调用实践
异步编程 - 05 基于JDK中的Future实现异步编程(中)_CompletableFuture
Java8 - 使用工厂方法 supplyAsync创建 CompletableFuture
小小工匠
2023/09/09
2940
android-okhttp
github地址 https://github.com/square/okhttp //引入okhttp包 private final OkHttpClient client = new OkHttpClient();
tea9
2022/07/16
2640
Spring 异步调用,一行代码实现!舒服,不接受任何反驳~
在日常开发中,我们的逻辑都是同步调用,顺序执行。在一些场景下,我们会希望异步调用,将和主线程关联度低的逻辑异步调用,以实现让主线程更快的执行完成,提升性能。例如说:记录用户访问日志到数据库,记录管理员操作日志到数据库中。
芋道源码
2020/05/25
5.9K0
java实现异步回调返回给前端
在Java中实现异步回调并将结果返回给前端,通常是在Web应用开发中处理耗时操作时所采用的技术手段,以避免阻塞HTTP请求线程并提高用户体验。以下是一个简单的例子,说明如何通过Spring WebFlux或者Servlet 3.0及以上标准的异步API配合JSON响应的方式实现这一目标。
JaneYork
2024/05/25
3960
SpringBoot中异步请求和异步调用(看这一篇就够了)
可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如长时间的运算)时再对客户端进行响应。
Java团长
2019/12/25
3.2K0
SpringBoot中异步请求和异步调用(看这一篇就够了)
相关推荐
异步编程的几种方式,你知道几种?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档