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";
            }
        };
    }
}
目录
相关文章
|
2月前
|
前端开发 JavaScript Java
使用Ajax进行异步交互:提升Java Web应用的用户体验
【4月更文挑战第3天】Ajax技术在Web开发中提升UX,通过与服务器异步交互实现页面局部更新,无需完整刷新。核心组件包括XMLHttpRequest、JavaScript、HTML/CSS及服务器端脚本。在Java Web应用中,可使用原生JavaScript或框架如jQuery、AngularJS实现Ajax请求。Ajax减少页面刷新,实现实时数据更新,即时表单验证和动态UI,显著改善用户体验,是现代Web开发不可或缺的一部分。
|
2月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
2月前
|
存储 安全 Java
【深度挖掘Java并发编程底层源码】「底层技术原理体系」带你零基础认识和分析学习相关的异步任务提交机制FutureTask的底层原理
【深度挖掘Java并发编程底层源码】「底层技术原理体系」带你零基础认识和分析学习相关的异步任务提交机制FutureTask的底层原理
24 0
|
4天前
|
消息中间件 存储 负载均衡
Java中的异步消息传递模式
Java中的异步消息传递模式
|
15天前
|
存储 Java 数据库连接
Android Java开发异步
【6月更文挑战第15天】
|
23天前
|
监控 网络协议 Java
Java一分钟之-Netty:高性能异步网络库
【6月更文挑战第11天】Netty是Java的高性能异步网络框架,基于NIO,以其高吞吐量、低延迟、灵活性和安全性受到青睐。常见问题包括内存泄漏、ChannelHandler滥用和异常处理不当。要规避这些问题,需正确释放ByteBuf,精简ChannelPipeline,妥善处理异常,并深入理解Netty原理。通过代码审查、遵循最佳实践和监控日志,可提升代码质量和性能。掌握Netty,打造高效网络服务。
23 2
|
1天前
|
Java API UED
Java异步API设计与实现
Java异步API设计与实现
|
2天前
|
消息中间件 Java 开发者
Java中实现事件驱动架构的异步通信技术
Java中实现事件驱动架构的异步通信技术
|
3天前
|
Java API UED
Java异步API设计与实现
Java异步API设计与实现
|
9天前
|
Java
java线程之异步回调
java线程之异步回调
9 0