首页 > 其他分享 >【Netty】Future & Promise

【Netty】Future & Promise

时间:2024-06-23 19:58:25浏览次数:25  
标签:DefaultPromise Netty log debug Future Promise new eventExecutors promise

Future & Promise

在异步处理时,经常用到这两个接口

首先要说明 netty 中的 Future 与 jdk 中的 Future 同名,但是是两个接口,netty 的 Future 继承自 jdk 的 Future,而 Promise 又对 netty Future 进行了扩展

  • jdk Future 只能同步等待任务结束(或成功、或失败)才能得到结果

  • netty Future 可以同步等待任务结束得到结果,也可以异步方式得到结果,但都是要等任务结束

  • netty Promise 不仅有 netty Future 的功能,而且脱离了任务独立存在,只作为两个线程间传递结果的容器

功能/名称jdk Futurenetty FuturePromise
cancel取消任务--
isCanceled任务是否取消--
isDone任务是否完成,不能区分成功失败--
get获取任务结果,阻塞等待--
getNow-获取任务结果,非阻塞,还未产生结果时返回 null-
await-等待任务结束,如果任务失败,不会抛异常,而是通过 isSuccess 判断-
sync-等待任务结束,如果任务失败,抛出异常-
isSuccess-判断任务是否成功-
cause-获取失败信息,非阻塞,如果没有失败,返回null-
addLinstener-添加回调,异步接收结果-
setSuccess--设置成功结果
setFailure--设置失败结果

下面是各个方式的演示用例

例1

同步处理任务成功

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);
​
eventExecutors.execute(()->{
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.debug("set success, {}",10);
    promise.setSuccess(10);
});
​
log.debug("start...");
log.debug("{}",promise.getNow()); // 还没有结果
log.debug("{}",promise.get());

输出

例2

异步处理任务成功

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);
​
// 设置回调,异步接收结果
promise.addListener(future -> {
    // 这里的 future 就是上面的 promise
    log.debug("{}",future.getNow());
});
​
// 等待 1000 后设置成功结果
eventExecutors.execute(()->{
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.debug("set success, {}",10);
    promise.setSuccess(10);
});
​
log.debug("start...");

例3

同步处理任务失败 - sync & get

DefaultEventLoop eventExecutors = new DefaultEventLoop();
        DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);
​
        eventExecutors.execute(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            RuntimeException e = new RuntimeException("error...");
            log.debug("set failure, {}", e.toString());
            promise.setFailure(e);
        });
​
        log.debug("start...");
        log.debug("{}", promise.getNow());
        promise.get(); // sync() 也会出现异常,只是 get 会再用 ExecutionException 包一层异常

输出

例4

同步处理任务失败 - await

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);

eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    RuntimeException e = new RuntimeException("error...");
    log.debug("set failure, {}", e.toString());
    promise.setFailure(e);
});

log.debug("start...");
log.debug("{}", promise.getNow());
promise.await(); // 与 sync 和 get 区别在于,不会抛异常
log.debug("result {}", (promise.isSuccess() ? promise.getNow() : promise.cause()).toString());

例5

异步处理任务失败

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);
​
promise.addListener(future -> {
    log.debug("result {}", (promise.isSuccess() ? promise.getNow() : promise.cause()).toString());
});
​
eventExecutors.execute(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    RuntimeException e = new RuntimeException("error...");
    log.debug("set failure, {}", e.toString());
    promise.setFailure(e);
});
​
log.debug("start...");

输出

例6

await 死锁检查

DefaultEventLoop eventExecutors = new DefaultEventLoop();
DefaultPromise<Integer> promise = new DefaultPromise<>(eventExecutors);
​
eventExecutors.submit(()->{
    System.out.println("1");
    try {
        promise.await();
        // 注意不能仅捕获 InterruptedException 异常
        // 否则 死锁检查抛出的 BlockingOperationException 会继续向上传播
        // 而提交的任务会被包装为 PromiseTask,它的 run 方法中会 catch 所有异常然后设置为 Promise 的失败结果而不会抛出
    } catch (Exception e) { 
        e.printStackTrace();
    }
    System.out.println("2");
});
eventExecutors.submit(()->{
    System.out.println("3");
    try {
        promise.await();
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("4");
});

输出

标签:DefaultPromise,Netty,log,debug,Future,Promise,new,eventExecutors,promise
From: https://blog.csdn.net/m0_62645012/article/details/139903945

相关文章

  • 【Netty】nio处理accept&read&write事件
          ......
  • arm环境,报错 no com_alibaba_nacos_shaded_io_grpc_netty_shaded_netty_transport_nat
    大概率版本号不对,sprintcloud版本+netty版本netty版本4.1.101.Final点击查看代码<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.101.Final</version></dependency><depend......
  • CompletableFuture多线程并发处理
    CompletableFuture多线程并发处理   概要  一个接口可能需要调用N个其他服务的接口,这在项目开发中还是挺常见的。举个例子:用户请求获取订单信息,可能需要调用用户信息、商品详情、物流信息、商品推荐等接口,  如果是串行(按顺序依次执行每个任务)执行的话,接口的响应速......
  • 理解 Java 中的 Future 及其底层实现
    目录什么是Future?Future的基本用法Future的局限性及改进Future的底层实现小结什么是Future?Future是Java中一个用于表示异步计算结果的接口。它主要用于处理那些可能需要较长时间运行的任务,使得主线程可以继续执行其他工作,而无需等待任务完成。Future的定义Fut......
  • 多线程设计模式之Future模式
    在JDK中实现线程同步等待闭环(FutureTask/Future)中已经涉及到了Future模式,相对与多线程设计模式之WorkerThread模式有何异同呢?在多线程设计模式之WorkerThread模式中client和worker之间没有任何直接联系,即worker执行的结果client是不关心的;Future模式与之的差别就在于此线......
  • 关于netty 一些使用细节
    netty的客户端通常是websoket  但是为了演示也可以用netty做客户端,Channel:可以被理解为数据传输的通道。Pipeline:可以被视为一个由多个工序组成的流水线,负责将数据(事件)传递给流水线上的每个处理工序(handler)。Msg:指的是在流水线上流动的数据。最初输入的数据通常是ByteBuf......
  • 掌握异步编程:探索JavaScript中的Promise与async/await
    在现代JavaScript开发中,异步编程已经成为了不可或缺的一部分。为了更好地处理异步操作,JavaScript引入了Promise和async/await两个重要概念。本文将带您了解这两个概念,帮助您掌握异步编程。 PromisePromise是异步编程的一种解决方案,它表示一个异步操作的最终完成(或失败)及其结......
  • 深入解读Netty中的NIO:原理、架构与实现详解
    深入解读Netty中的NIO:原理、架构与实现详解Netty是一个基于Java的异步事件驱动网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。Netty的核心是基于JavaNIO(Non-blockingI/O)的,因此理解Netty的实现需要先了解JavaNIO的基本概念和机制。JavaNIO简介Jav......
  • 深入浅出Netty:高性能网络应用框架的原理与实践
    深入浅出Netty:高性能网络应用框架的原理与实践1.Netty简介Netty是一个基于Java的异步事件驱动的网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端。它提供对多种协议(如TCP、UDP、SSL等)的支持,适用于各种网络通信场景。2.核心组件Channel:代表一个到远程......
  • Es6中promise的解释用法以及何为同步异步、回调函数和回调地狱?
    一.什么是回调函数?        1.含义                ★回调函数是一种特殊的函数,它作为参数传递给另一个函数,并在特定事件或条件发生时被调用执行。        2.回调函数在编程中扮演着重要的角色,主要用于以下场景:            ......