03-Netty中的Future接口
文章目录
- Netty中的Future体系
- 一、Future
- 1.1 Future接口
- 1.1.1 JDK Future
- 1.1.2 Netty Future
- 1.2 Future派生子接口
- 1.2.1 Promise
- 1.2.2 ChannelFuture
- 1.2.3 ChannelGroupFuture
- 1.2.4 ProgressiveFuture
- 1.2.5 ScheduledFuture
- 1.3 抽象实现类AbstractFuture
- 二、小结
- 三、参考
Netty中的Future体系
- Future体系在线程池部分有分析过,它代表了一个异步操作的结果,一个典型的子接口和实现是RunnableFuture接口和FutureTask。相关内容可以参考:Future接口
- 在Netty中有着大量的异步操作,在获取异步操作结果也需要使用到Future,不过对于Netty而言,JDK中的Future机制相对来说简单,为了更加方便的异步编程,Netty基于Future接口扩展了一些自己的接口,我们先看看有哪些接口体系。
一、Future
- JDK中的Future接口是java.util.concurrent.Future,Netty中也有Future接口,全类名是io.netty.util.concurrent.Future,它继承自JDK中的Future接口,也是整个NettyFuture体系的顶层接口,对于的继承关系如下:
- 看的出来继承关系是比较复杂的,每一个类都去分析显然也比较困难,本文我们就先从接口开始,看看Netty的Future和它派生出来的子接口分别代表什么。
1.1 Future接口
1.1.1 JDK Future
- 参考文章[1]中我们分析了JUC包中的Future,它定义的方法不算多,我们看看Netty/Future有什么扩展。
//下面是JDK的Future
public interface Future<V> {/*** 1.尝试取消任务,如果任务已经完成或者被取消则会取消失败,也有可能因为其他原因取消失败,方法返回true表示取消成功,* false表示取消失败,通常是因为任务已经开始了* 2.如果任务还未开始并且被取消成功,那么这个任务再也不会被执行* 3.如果任务已经开始,mayInterruptIfRunning参数决定执行该任务的线程是否需要中断任务,true表示正在执行任务的线程需要中断,false表示既然已经开始执行了,就执行完毕吧* 4.如果方法返回true,那么isDone和isCancelled也会返回true*/boolean cancel(boolean mayInterruptIfRunning);//如果任务在完成之前被取消,返回trueboolean isCancelled();//如果任务已经完成,返回true,这里的完成不仅仅是代表正常完成,也有可能是异常终止,取消,这些都会返回trueboolean isDone();//阻塞获取异步执行的结果V get() throws InterruptedException, ExecutionException;//指定超时时间的get超时V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;
}
1.1.2 Netty Future
- Netty的Future接口
/*** 异步操作结果接口*/
@SuppressWarnings("ClassNameSameAsAncestorName")
public interface Future<V> extends java.util.concurrent.Future<V> {/*** 只有当IO操作成功结束是返回true,其余情况返回false*/boolean isSuccess();/*** 当操作可以被cancel方法取消,该方法返回true,否则返回false*/boolean isCancellable();/*** 如果IO操作失败,返回IO操作失败的原因*/Throwable cause();/*** 添加监听器,监听器会在任务结束后被调用,如果任务已经结束,那么监听器会被立刻执行*/Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener);/*** 移除第一个监听器*/Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener);/*** 同步等待Future,如果失败抛出异常,支持中断*/Future<V> sync() throws InterruptedException;/*** 同步等待Future,如果失败抛出异常,不支持中断*/Future<V> syncUninterruptibly();/*** 等待到任务结束,支持中断*/Future<V> await() throws InterruptedException;/*** 等待到任务结束,不支持中断(注释写了会捕获中断异常,然后默默的丢弃掉)*/Future<V> awaitUninterruptibly();/*** 支持超时参数的await,支持中断*/boolean await(long timeout, TimeUnit unit) throws InterruptedException;/*** 支持超时参数的await,不支持中断*/boolean awaitUninterruptibly(long timeout, TimeUnit unit);/*** 立刻返回结果,如果完成了就返回结果,没完成就返回null*/V getNow();/*** 继承自JDKFuture的方法*/@Overrideboolean cancel(boolean mayInterruptIfRunning);
}
- 由此我们看到Netty中的Future除了继承自JDK的Future之外,还定义了许多自己的方法,比如最重要的是添加监听器,这样就能在任务结束之后自动回调监听器中自己需要执行的逻辑。
1.2 Future派生子接口
1.2.1 Promise
- Promise代表可写的Future,在Future接口中,我们只能对其进行“读”操作,获取结果,判断是否完成等,但是我们不能对其进行写操作。而Promise代表可写的Future,Promise增强了Future的功能,通过Promise可以为Future设置结果,比如成功或者失败原因等。
/*** 可写的Future对象*/
public interface Promise<V> extends Future<V> {/*** 将Future设置为success,并通知所有监听者*/Promise<V> setSuccess(V result);/*** 尝试将Future设置为success,并通知所有监听者,尝试成功返回true,失败则返回false*/boolean trySuccess(V result);/*** 将Future设置为failure,并通知所有监听者*/Promise<V> setFailure(Throwable cause);/*** listeners.* 将Future设置为failure,并通知所有监听者 ,尝试成功返回true,失败则返回false*/boolean tryFailure(Throwable cause);/*** 将future设置为不能中断*/boolean setUncancellable();
}
1.2.2 ChannelFuture
- ChannelFuture是代表一个Channel异步IO操作的结果,自身自定义了1个主要方法,将Future关联的Channel对象返回
/*** Channel异步IO操作的结果,Netty中所有的IO操作都是异步的,IO操作会直接返回并且不保证最* 后能够成功完成,用户通过返回的ChannelFuture对象来获取结果。* The result of an asynchronous {@link Channel} I/O operation.* +---------------------------+* | Completed successfully |* +---------------------------+* +----> isDone() = true |* +--------------------------+ | | isSuccess() = true |* | Uncompleted | | +===========================+* +--------------------------+ | | Completed with failure |* | isDone() = false | | +---------------------------+* | isSuccess() = false |----+----> isDone() = true |* | isCancelled() = false | | | cause() = non-null |* | cause() = null | | +===========================+* +--------------------------+ | | Completed by cancellation |* | +---------------------------+* +----> isDone() = true |* | isCancelled() = true |* +---------------------------+*/
public interface ChannelFuture extends Future<Void> {/*** Returns a channel where the I/O operation associated with this future takes place.* <p>* 返回Future关联的IO操作对应的Channel通道*/Channel channel();/*** 返回true表示ChannelFuture是void,此时不能调用下面的方法:addListener、addListeners、await、sync、syncUninterruptibly*/boolean isVoid();
}
1.2.3 ChannelGroupFuture
- ChannelGroupFuture代表一个ChannelGroup的IO执行结果
/*** ChannelGroupFuture代表一个ChannelGroup里面的IO操作的集合*/
public interface ChannelGroupFuture extends Future<Void>, Iterable<ChannelFuture> {/*** 返回对应的ChannelGroup*/ChannelGroup group();/*** 根据Channel,找到其对应的ChannelFuture*/ChannelFuture find(Channel channel);@Overrideboolean isSuccess();@OverrideChannelGroupException cause();/*** 是否部分成功*/boolean isPartialSuccess();/*** 是否部分失败*/boolean isPartialFailure();}
1.2.4 ProgressiveFuture
- ProgressiveFuture是用于代表一个操作进度的Future,本身没有定义任何方法,都是继承自Future
1.2.5 ScheduledFuture
- ScheduledFuture用于代表一个预定的异步操作(scheduled asynchronous operation)的结果。
1.3 抽象实现类AbstractFuture
- AbstractFuture是Future的一个抽象实现类,AbstractFuture没有实现什么方法,只实现了get()方法,方法内部还依赖很多其他的方法,比如:await()、cause()、getNow() , 这些都需要子类去实现。
/*** Abstract {@link Future} implementation which does not allow for cancellation.* Future的抽象实现,*/
public abstract class AbstractFuture<V> implements Future<V> {@Overridepublic V get() throws InterruptedException, ExecutionException {//1.等待任务完成await();//2.获取异常Throwable cause = cause();if (cause == null) {//3.没有异常则获取结果return getNow();}//4.有异常就抛出if (cause instanceof CancellationException) {throw (CancellationException) cause;}throw new ExecutionException(cause);}@Overridepublic V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {if (await(timeout, unit)) {Throwable cause = cause();if (cause == null) {return getNow();}if (cause instanceof CancellationException) {throw (CancellationException) cause;}throw new ExecutionException(cause);}throw new TimeoutException();}
}
二、小结
- 本文主要介绍了Netty中的Future接口,它继承自JDK的Future接口,并扩展了一些方法,主要是增加了对监听器的支持。
- Netty的Future接口派生出了很多子接口, 派生出的子接口自然具备Future这个基本的功能,除此之外,各自具备一些自身的接口特点,比如
Promise代表可写的Future,ChannelFuture代表Channel异步IO的结果,ChannelGroupFuture代表一个ChannelGroup的结果,ProgressiveFuture代表一个操作进度,ScheduledFuture代表预定操作的结果,具体不同的接口往下继续派生的接口和子类,我们在后面根据重要程序和使用情况慢慢分析,这也不是一篇文章足以涵盖的。
三、参考
- [1] Future接口
03-Netty中的Future接口相关推荐
- netty中的future和promise源码分析(二)
前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...
- Netty中的Future
先看下Future的整个继承体系,还有一个ChannelFuture不在里面: 在并发编程中,我们通常会用到一组非阻塞的模型:Promise,Future 和 Callback.其中的 Fut ...
- java中 immutable,future,nio
什么是Future? 用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应 ...
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
- java future接口_java Future 接口介绍
在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API的一部分,在java.uti ...
- Java Future接口、Future模式理解
原文地址:https://blog.csdn.net/devinteng/article/details/23455733 Future接口介绍: 在Java中,如果需要设定代码执行的最长时间,即超时 ...
- 中的listeners_Netty源码学习(6)-- Netty中的异步处理
Java中的Future:对于一个异步操作,可以暂时返回一个Future对象,然后去做别的事情.最后通过get方法拿到结果.如果get时异步操作还没有完成,则进行阻塞状态. Netty对Future类 ...
- netty系列之:netty中的Channel详解
文章目录 简介 Channel详解 异步IO和ChannelFuture Channel的层级结构 释放资源 事件处理 总结 简介 Channel是连接ByteBuf和Event的桥梁,netty中的 ...
- Netty 中的粘包和拆包详解
Netty 底层是基于 TCP 协议来处理网络数据传输.我们知道 TCP 协议是面向字节流的协议,数据像流水一样在网络中传输那何来 "包" 的概念呢? TCP是四层协议不负责数据逻 ...
最新文章
- java求反字符_java 反取字符串
- new失败跟踪函数_WinDbg预览时间线:调试器中的时间线可以允许用户记录跟踪
- html加密文档如何打开,Word文档加密打不开怎么办?
- * Dijkstra 堆优化
- MySQL命令窗口出现中文乱码的解决方法
- 关于Decision in process状态时间变化的解释
- oracle安装sqluldr2,Oracle sqluldr2工具使用方法
- 人体姿态识别-左肩和左肘的定位识别
- SAP中计划策略11测试
- 全程实操 | 最新版OpenCV4.4免费视频课程送给大家
- Excel技能之查找筛选排序,同事竖起大拇指
- Linux运维之windows2008R2远程连接问题
- 通过python requests第三方库抓取淘宝商品名称和信息价格
- openvino下载模型
- hamming code/汉明编码
- Json格式的数据集标签转化为有效的txt格式(data_coco)
- 教你如何将你的Qt项目打包安装在MeeGo系统中
- 1元云购网站开通微信支付设置方法
- SQL获取数据表中所有列名
- Android高级工程师 上海/8K-12K/经验1-3年/全职/(原始股技术合伙人)