当前位置: 首页 > 网络应用技术

1.未来<v>和Promise <v>之间的关系

时间:2023-03-08 10:38:41 网络应用技术

  欢迎大家注意github.com/hsfxuebao。我希望这对每个人都会有所帮助。如果您认为有可能

  io.netty.util.current.futur 从java.util.concurrent.future继承并承诺这是前者的特殊实施。

  Java并发编程软件包提供未来interface.futur内部方法可以实现操作,例如状态检查,取消执行和获得执行结果。内部方法如下:

  本地未来该功能相对有限,Netty扩展了滤清器并添加以下方法:

  在阅读了上面的Netty的未来接口后,我们可以发现它添加了Sync()和等待()以阻止Wait.Actirationally call isDone()以获取状态,或通过get()阻止方法获得值。

  所以它实际上有两个使用范式

  顺便说一句,sync()和等待():sync()之间的差异将首先调用等待()方法。等待()方法返回后,它将检查任务是否失败。换句话说,如果任务被异常抛出,则等待()方法将返回,但不会引发异常,而Sync()方法将在返回时抛出异常。

  我们还可以看到,未来接口与IO操作无关,或将其与_ pure _接口的接口进行比较。

  承诺该界面继续继承未来并添加几组设置并回电:

  可以看到,保证作为一个特殊的未来,只需添加一些状态设置方法。因此,它通常在I/O业务代码中使用,并且在I/O结束后用于成功(或失败)。

  以连接到客户的注册过程为例,调用链接如下:

  继续跟踪在Singlethreadeventloop中,您将看到此代码:

  这里建立了一个新的构造函数,并将构造函数传递到当前频道和当前线程中。从第一部分的类图,我们知道DefaultChannelPromise还同时实现未来和承诺,并使用所有提到的所有方法多于。

  然后继续将承诺传递到另一种寄存器方法中:

  在注册方法中,承诺继续将承诺传递给不安全的寄存器方法,并立即以channelfuture的形式返回了承诺。显然,这是一个异步的回调处理:上层业务可以使返回的渠道返回的渠道阻止结果或设置回调方法,并且继续传递的承诺可以用于设置执行状态和回调设置。

  我们可以继续调试以查看:

  可以看出,基础I/O操作成功,或者是否可以通过承诺设置状态,外层的通道可以感知I/O操作的结果。

  接下来,让我们看一下未来接口ChannEnelture的子接口。该界面最多使用。它将与IO操作中的通道相关联,以使用异步处理通道中的事件。

  我们看到,频道接口除了将来的接口外没有增加任何东西。还有一种iSvoid()方法并不重要。原始的未来。

  让我们看一下返回的Channenelture的目的:

  在这里,无论在这里,异常堆栈是否为空,您可以检查I/O是否已提前失败。

  在这里,您可以知道是否通过Channelture#iSdone()方法完成了基础注册。如果完成,请继续执行绑定操作。

  但是,由于注册是一种异步操作,因此,如果目前未完成注册,则将输入以下逻辑:

  这是一个新的悬而未决的信息,为原始频道对象添加了回调方法,并在回调过程中更改待处理的状态,并且挂在registrationPromise将继续传递到上层。回来,它将输入回调方法。结果,I/O状态继续向外传递。

  我们已经理解了承诺和滤清器的异步模型。LET看一下如何实现底层。以最常用的DefaultChannelPromise为例。内部非常简单。我们主要查看其父级DefaultPromise:Java

  以成功状态为示例(setSuccess):

  设定承诺的状态实际上是结果字段的结果字段修改的执行结果。值得注意的是,结果字段具有挥发性关键字,以确保Multi -Threaded.in之间的可见性。在设置状态后,您,您将尝试唤醒所有阻止承诺后结果的线程。

  其他设置状态方法不再重复,基本上是相同的。

  如上所述,其他线程将阻止承诺返回的结果。特定的实现基于同步方法为例:

  所有调用同步方法的线程将被阻止,直到将承诺设置为成功或失败为止。这还解释了为什么当Netty客户端或服务器启动时,通常调用同步方法。从本质上讲,它是要阻止当前线程并等待I/O结果返回异步。如下:

  从上方可以看出,添加加法方法后,将立即检查承诺;如果承诺已经完成,则立即调用回调方法。

  让我们谈谈上图左侧的部分。尽管我们不知道在bind()操作中会做什么工作,但我们应该能够猜测一两个。

  显然,调用B.Bind(端口)的方法将返回渠道。bind()是一种异步方法。当某个执行线程执行真实的绑定操作时,执行线程肯定会将未来标记为成功。(我们假设bind将成功),然后在此处返回Sync()方法(MAIN线程)。

  如果绑定(端口)失败,我们知道Sync()方法将异常抛出,然后将其执行到最终块。

  一旦绑定端口绑定成功并输入以下行,F.Channel()方法将返回与未来关联的通道。

  channel.closefuture()还返回一个通道,然后调用Sync()方法。此Sync()方法返回的条件是:其他线程关闭NioServerSocketchannel,通常是因为服务需要未来的状态(setSuccess(resul)(result)(result)或setFailure(原因)(原因),并且此Sync()方法将返回。

  Netty的承诺和光电机制是基于Java并发数据包的未来。在他们的开发中,未来支持阻止等待,添加回调方法,判断执行状态等,并承诺主要支持状态设置相关方法。当基础I/O操作通过承诺更改执行状态时,我们可以立即获得结果未来,同步等待。

  因此,在Netty的异步模型中,诺言和未来与双胞胎紧密相关。但是我认为两者更像是量子纠缠中的两个电子,因为改变了其中一个的状态,另一方可以立即感知。

  在这一点上,已经分析了诺言和未来的核心原则。

  Netty学习和源代码分析GitHub地址

  从进入到熟练视频教程(B)的Netty

  Netty权威指南第二版

  Netty的未来和承诺

  Netty源代码分析的四个

  原始:https://juejin.cn/post/709756068291202559