当前位置: 首页 > news >正文

Netty之io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future初解

目录

目标

Netty版本

Netty官方API

三者之间的关系

基本使用方法

java.util.concurrent.Future

io.netty.util.concurrent.Future

io.netty.util.concurrent.Promise


目标

  • 了解io.netty.util.concurrent.Promise与io.netty.util.concurrent.Future的基本使用方法。
  • 了解java.util.concurrent.Future、io.netty.util.concurrent.Promise,io.netty.util.concurrent.Future之间的关系。

Netty版本

        <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.87.Final</version></dependency>

Netty官方API

Netty API Reference (4.1.89.Final)icon-default.png?t=N176https://netty.io/4.1/api/index.html


三者之间的关系

区别

  • jdk自带的Future只能同步等待结果。
  • netty自带的Future能同步等待结果,也可以用异步的方式(如:使用addListener方法设置回调方法)等待结果。
  • Promise有Future的所有功能,脱离任务独立存在(可以主动创建并赋结果),只作为线程之间传递结果的容器。

关联

Promise extends netty自带的Future extends jdk自带的Future


基本使用方法

java.util.concurrent.Future

package com.ctx.netty;import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;@Slf4j
public class JavaFuture {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);Future<String> future = executor.submit(new Callable<String>() {@Overridepublic String call() throws Exception {Thread.sleep(1000);return "result";}});//同步阻塞返回结果。try {log.info("返回结果值:{}",future.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}
}

io.netty.util.concurrent.Future

package com.ctx.netty;import io.netty.channel.EventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;@Slf4j
public class NettyFuture {public static void main(String[] args) {NioEventLoopGroup eventExecutors = new NioEventLoopGroup();EventLoop eventLoop = eventExecutors.next();Future<Map<String, Object>> future = eventLoop.submit(new Callable<Map<String, Object>>() {@Overridepublic Map<String, Object> call() throws Exception {Thread.sleep(1000);Map<String, Object> map = new HashMap<>();map.put("name", "zhangsan");return map;}});new NettyFuture().getNow(future);}/*** 同步阻塞等待结果。* @param future*/public void get(Future<Map<String, Object>> future){try {log.info("结果是:"+future.get());} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}/***异步方式等待结果。* @param future*/public void getNow(Future<Map<String, Object>> future){future.addListener(new GenericFutureListener<Future<? super Map<String, Object>>>() {//拿到结果以后回调方法。所以此时执行get()还是getNow()是一样的效果。@Overridepublic void operationComplete(Future<? super Map<String, Object>> future) throws Exception {log.info("结果是:"+future.getNow());}});}
}

io.netty.util.concurrent.Promise

package com.ctx.netty;import io.netty.channel.EventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.DefaultPromise;
import io.netty.util.concurrent.Promise;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;@Slf4j
public class NettyPromise {public static void main(String[] args) {NioEventLoopGroup eventExecutors = new NioEventLoopGroup();EventLoop eventLoop = eventExecutors.next();//自定义类型,用于填充结果。Promise<Map<String, Object>> promise = new DefaultPromise<>(eventLoop);new Thread(()->{try {Thread.sleep(1000);Map<String, Object> map = new HashMap<>();map.put("name","zhangsan");promise.setSuccess(map);} catch (Exception e) {promise.setFailure(e);}}).start();try {Map<String, Object> map = promise.get();map.forEach((k,v)->{System.out.println(k+"="+v);});} catch (InterruptedException e) {throw new RuntimeException(e);} catch (ExecutionException e) {throw new RuntimeException(e);}}
}

http://www.lryc.cn/news/24945.html

相关文章:

  • 【正点原子FPGA连载】第二十一章AXI DMA环路测试 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
  • 手把手搭建springboot项目06-springboot整合RabbitMQ及其原理和应用场景
  • 如何根据IP地址判断是IPv4还是IPv6
  • 山地车和公路车怎么选
  • Zotero设置毕业论文/中文期刊参考文献格式
  • 【人工智能与深度学习】自动编码器的简介
  • Isaac-gym(9):项目更新、benchmarks框架梳理
  • Linux 学习笔记(一):终端 和 Shell 的区别和联系
  • cycleGAN算法解读
  • 解读“方差”
  • 记录面试问题
  • (六十四)设计索引的时候,我们一般要考虑哪些因素呢?(上)
  • 【蓝桥杯嵌入式】LCD屏的原理图解析与代码实现(第十三届省赛为例)——STM32
  • 论文学习——Reproducing Activation Function for Deep Learning
  • 【趣味学Python】Python基础语法讲解
  • 虚拟局域网VLAN的实现机制
  • Mask R-CNN 算法学习总结
  • Gorm -- 添加记录
  • go提高升阶(四) I/O流学习
  • 【代码随想录训练营】【Day28】第七章|回溯算法|93.复原IP地址|78.子集|90.子集II
  • Get请求和Post请求区别
  • static关键字
  • A Comprehensive Tool for Modeling CMOS Image-Sensor-Noise Performance论文总结及翻译
  • 嘀嗒出行再闯IPO:千军万马我无懈
  • MATLAB算法实战应用案例精讲-【优化算法】增强型鲸鱼优化算法(EWOA)(附matlab代码实现)
  • 登录Oracle数据库遇到ORA-01017密码错误的解决办法
  • 10个黑客基础教程!简单有效
  • JPA之实体之间的关系
  • 如何在 C++ 中调用 python 解析器来执行 python 代码(三)?
  • 【Linux】gcc/g++/gdb的使用