Java中异步回调

简介: Java中异步回调

1、先定义一个异步工作接口

public interface Worker {
    String action(Object object);
}

2、再定义一个回调监听器,将Worker的执行结果 放到result的参数里

public interface Listener {
    void result(Object result);
}

3、再定义包装器,将Worker和Listener包装一下

public class Wrapper {
    private Object param;
    private Worker worker;
    private Listener listener;
    public Object getParam() {
        return param;
    }
    public void setParam(Object param) {
        this.param = param;
    }
    public Worker getWorker() {
        return worker;
    }
    public void setWorker(Worker worker) {
        this.worker = worker;
    }
    public Listener getListener() {
        return listener;
    }
    public void addListener(Listener listener) {
        this.listener = listener;
    }
}

4、测试回调

public class CallBackTest {
    public static void main(String[] args) {
        CallBackTest callBackTest = new CallBackTest();
        Worker worker = callBackTest.newWorker();
        Wrapper wrapper = new Wrapper();
        wrapper.setWorker(worker);
        wrapper.setParam("I am a Param");
        callBackTest.doWork(wrapper).addListener(new Listener() {
            @Override
            public void result(Object result) { // 耗时线程执行完毕后,回调这个方法
                System.out.println(Thread.currentThread().getName()); // Thread-0
                System.out.println(result); // I am a Param action result
            }
        });
        System.out.println(Thread.currentThread().getName()); // main
    }
    private Wrapper doWork(Wrapper wrapper) {
        new Thread(() -> {
            Worker worker = wrapper.getWorker();
            String result = worker.action(wrapper.getParam());
            wrapper.getListener().result(result);
        }).start();
        return wrapper;
    }
    private Worker newWorker() {
        return new Worker() {
            @Override
            public String action(Object object) { // 这里object就是param参数
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return object + " action result";
            }
        };
    }
}

5、测试回调带超时

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class CallBackTimeOutTest {
    public static void main(String[] args) {
        CallBackTimeOutTest callBackTimeOutTest = new CallBackTimeOutTest();
        Worker worker = callBackTimeOutTest.newWorker();
        Wrapper wrapper = new Wrapper();
        wrapper.setWorker(worker);
        wrapper.setParam("I am Param");
        //添加结果回调器
        wrapper.addListener(new Listener() {
            @Override
            public void result(Object result) {
                System.out.println(result); // time out exception
            }
        });
        CompletableFuture future = CompletableFuture.supplyAsync(() -> callBackTimeOutTest.doWork(wrapper));
        try {
            future.get(800, TimeUnit.MILLISECONDS); // 超过800ms就算超时
        } catch (InterruptedException | TimeoutException | ExecutionException e) {
            //超时了
            wrapper.getListener().result("time out exception");
        }
        System.out.println(Thread.currentThread().getName()); // main
    }
    private Wrapper doWork(Wrapper wrapper) {
        Worker worker = wrapper.getWorker();
        String result = worker.action(wrapper.getParam());
        wrapper.getListener().result(result);
        return wrapper;
    }
    private Worker newWorker() {
        return new Worker() {
            @Override
            public String action(Object object) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return object + " action result";
            }
        };
    }
}
目录
相关文章
|
3月前
|
Java
探索Java新境界!异步+事件驱动,打造响应式编程热潮,未来已来!
【8月更文挑战第30天】在现代软件开发中,系统响应性和可扩展性至关重要。Java作为主流编程语言,提供了多种机制如Future、CompletableFuture及事件驱动编程,有效提升应用性能。本文探讨Java异步编程模型与事件驱动编程,并介绍响应式模式,助您构建高效、灵活的应用程序。
59 3
|
3月前
|
Java
Java如何标记异步方法
【8月更文挑战第13天】Java如何标记异步方法
30 1
|
4月前
|
消息中间件 Java Kafka
如何在Java中实现异步消息处理?
如何在Java中实现异步消息处理?
|
2月前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
3月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
71 3
|
3月前
|
前端开发 JavaScript Java
java实现异步回调返回给前端
综上,Java中实现异步回调并将结果返回给前端是一项涉及后端异步处理和前端交互的综合任务。在实际项目中,开发人员需要根据应用需求和性能预期选择合适的异步模型与工具,并进行适当的配置和优化。
201 3
|
3月前
|
前端开发 Java UED
java实现异步回调返回给前端
通过以上的方式,可以优雅地在Java中实现异步回调并将结果返回给前端,大大提升了应用程序的响应能力和用户体验。
224 1
|
3月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
84 0
|
5月前
|
消息中间件 存储 负载均衡
Java中的异步消息传递模式
Java中的异步消息传递模式
|
4月前
|
消息中间件 Java 中间件
Java中的消息中间件与异步通信实现
Java中的消息中间件与异步通信实现