当前位置:首页 > Web开发 > 正文

重置notifyingListeners为false并且返回跳出循环notifyingListeners = false

2024-03-31 Web开发

比来一直在看Netty相关的内容,也在编写一个轻量级的RPC框架来练手,途中发明了Netty的源码有很多亮点,某些实现甚至可以用苛刻来形容。此外,Netty供给的工具类也是相当优秀,可以开箱即用。这里分析一下小我私家对照喜欢的范围,并发方面的一个Netty工具模块 - Promise。

技术图片

环境版本:

Netty:4.1.44.Final

JDK1.8

Promise简介

Promise,中文翻译为答理或者许诺,含义是人与人之间,一小我私家对另一小我私家所说的具有必然憧憬的话,一般是可以实现的。

io.netty.util.concurrent.Promise在注释中只有一句话:特殊的可写的io.netty.util.concurrent.Future(Promise接口是io.netty.util.concurrent.Future的子接口)。而io.netty.util.concurrent.Future是java.util.concurrent.Future的扩展,暗示一个异步操纵的功效。我们知道,JDK并发包中的Future是不成写,也没有供给可监听的入口(没有应用不雅察看者模式),而Promise很好地弥补了这两个问题。另一方面从担任关系来看,DefaultPromise是这些接口的最终实现类,所以阐起源码的时候需要把重心放在DefaultPromise类。一般一个模块供给的成果都由接口界说,这里分析一下两个接口的成果列表:

io.netty.util.concurrent.Promise

io.netty.util.concurrent.Future

先看io.netty.util.concurrent.Future接口:

public interface Future<V> extends java.util.concurrent.Future<V> { // I/O操纵是否执行告成 boolean isSuccess(); // 符号是否可以通过下面的cancel(boolean mayInterruptIfRunning)打消I/O操纵 boolean isCancellable(); // 返回I/O操纵的异常实例 - 如果I/O操纵自己是告成的,此要领返回null Throwable cause(); // 为当前Future实例添加监听Future操纵完成的监听器 - isDone()要领激活之后所有监听器实例会得到回调 Future<V> addListener(GenericFutureListener<? extends Future<? super V>> listener); Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners); // 为当前Future移除监听Future操纵完成的监听器 Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener); Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners); // 同步期待Future完成得到最终功效(告成)或者抛出异常(掉败),响应中断 Future<V> sync() throws InterruptedException; // 同步期待Future完成得到最终功效(告成)或者抛出异常(掉败),不响应中断 Future<V> syncUninterruptibly(); // 期待Future完成,响应中断 Future<V> await() throws InterruptedException; // 期待Future完成,不响应中断 Future<V> awaitUninterruptibly(); // 带超不时限的期待Future完成,响应中断 boolean await(long timeout, TimeUnit unit) throws InterruptedException; boolean await(long timeoutMillis) throws InterruptedException; // 带超不时限的期待Future完成,不响应中断 boolean awaitUninterruptibly(long timeout, TimeUnit unit); boolean awaitUninterruptibly(long timeoutMillis); // 非梗阻顿时返回Future的功效,如果Future未完成,此要领必然返回null;有些场景下如果Future告成获取到的功效是null则需要二次查抄isDone()要领是否为true V getNow(); // 打消当前Future实例的执行,如果打消告成会抛出CancellationException异常 @Override boolean cancel(boolean mayInterruptIfRunning); }

sync()和await()要领类似,只是sync()会查抄异常执行的情况,一旦发明执行异常顿时把异常实例包装抛出,而await()要领对异常无感知。

接着看io.netty.util.concurrent.Promise接口:

public interface Promise<V> extends Future<V> { // 符号当前Future告成,设置功效,如果设置告成,则通知所有的监听器,如果Future已经告成或者掉败,则抛出IllegalStateException Promise<V> setSuccess(V result); // 符号当前Future告成,设置功效,如果设置告成,则通知所有的监听器并且返回true,否则返回false boolean trySuccess(V result); // 符号当前Future掉败,设置功效为异常实例,如果设置告成,则通知所有的监听器,如果Future已经告成或者掉败,则抛出IllegalStateException Promise<V> setFailure(Throwable cause); // 符号当前Future掉败,设置功效为异常实例,如果设置告成,则通知所有的监听器并且返回true,否则返回false boolean tryFailure(Throwable cause); // 符号当前的Promise实例为不成打消,设置告成返回true,否则返回false boolean setUncancellable(); // 下面的要领和io.netty.util.concurrent.Future中的要领根基一致,只是改削了返回类型为Promise @Override Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener); @Override Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners); @Override Promise<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener); @Override Promise<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners); @Override Promise<V> await() throws InterruptedException; @Override Promise<V> awaitUninterruptibly(); @Override Promise<V> sync() throws InterruptedException; @Override Promise<V> syncUninterruptibly(); }

到此,Promise接口的所有成果都分析完毕,接下来从源码角度详细分析Promise的实现。

Promise源码实现

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31034.html