51

Netty推荐addListener回调异步执行

 6 years ago
source link: http://www.jiangxinlingdu.com/netty/2018/12/04/addlistener.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

说明

Netty推荐使用addListener的方式来回调异步执行的结果,这种方式优于Future.get,能够更精确地把握异步执行结束的时间。

错误理解使用addListener的方式

代码如下:

FrAjI3I.png!web

fEzMV3n.png!web

代码运行结果:

ZRnayqj.png!web

疑惑:很疑惑啊,按照上面Netty推荐使用addListener的方式来回调异步执行的结果,这种方式优于Future.get,能够更精确地把握异步执行结束的时间。而且也停顿了5s了,为什么还是顺序执行的呢?

感谢闪电侠、芋艿、晓峰的热心解答。

分析

这段代码 怎么执行都是顺序执行,不阻塞 最后,reactor线程里面都是同步的。

我们来跟踪代码进行查看:

nqemqu7.png!web

关键在这里,执行完成write之后返回promise。

uuaaUjI.png!web

如果是reactor那么就顺序执行,否则就加入队列等待后续执行(如果是顺序的就是等执行完成返回,如果是加入队列就是异步)

这里重点不在writeAndFlush,先分析同步是执行的情况,异步的下面正确方式会分析,如果是同步方式:

2IBFfun.png!web

也就是设置了值,之后promise之后返回。

那么:

VziyUzQ.png!web

IjuyyeM.png!web

qEbUv2I.png!web

所有就变成了java里面最普通的代码,一个线程代码从上到下执行。也解释了为什么没有走异步情况了。

正确理解使用addListener的方式

不在reactor线程里面执行,就可以做到最开始提到的:Netty推荐使用addListener的方式来回调异步执行的结果,这种方式优于Future.get,能够更精确地把握异步执行结束的时间。

FRZNBzu.png!web

执行效果如下:

JNnQfyU.png!web

继续进行分析:

nqemqu7.png!web

关键在这里,执行完成write之后返回promise。

uuaaUjI.png!web

由于是异步直接返回,其实isDone为false,之后addListener就很快添加完成,就执行下面语句了。

mq2Ezqy.png!web

6nMNjqe.png!web

V3YriiU.png!web

这里也可以看到是writeAndFlush执行完成之后调用回调事件,这样才是真正做到了异步执行。

总结

由于之前理解不深刻,感谢 闪电侠、芋艿、晓峰的热心解答 ,现在开朗多了,Netty继续学习中……,希望今天文章对你有所有收获!!!

文章github源代码地址: nettydemo ,或者公号回复“Netty”获取源码地址。


Recommend

  • 44
    • developer.51cto.com 6 years ago
    • Cache

    JavaScript异步之从回调函数到Promise

    【51CTO.com原创稿件】 JavaScript的异步处理是前端工程师必须接触的一块内容。ES6在JavaScript异步的处理上引入了新的特性,使得程序员能够更加优雅地...

  • 38

    netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型。netty里面充斥了大量的非阻塞回调模式,主要是靠Future/Promise异步模型来实现的。 Future是java.util.concurrent.Future,是Java提供的接口,可以...

  • 49
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    Netty 之异步通知机制

    一、异步通知代码走查 在Channel注册到Selector后,会返回ChannelFuture。如果注册未完成,会通过增加Listener来进行异步通知注册结果,接下来看下是如何回调的。 代码块

  • 14
    • zhuanlan.zhihu.com 4 years ago
    • Cache

    Node.js AsyncHooks 与异步回调上下文

    Node.js AsyncHooks 与异步回调上下文我们都知道,Nodejs 最显著特点是单进程、异步、事件驱动。每当我们的代码碰到异步调用时,需要传入一个回调函数,等待异步调用结束时再被执行。一个典型的处理用户登录流程如下:

  • 8
    • learnblockchain.cn 3 years ago
    • Cache

    dapp异步请求的回调

    dapp异步请求的回调 | 登链社区 | 技术问答 dapp异步请求的回调 ...

  • 7

    JS深挖:异步方案发展史 ——回调函数、Promise和async/await发布于 今天 13:57 本章围绕JS中异步进行展开,解决问题: 1、什么是异步,为何出现? 2、...

  • 7

    如果您已经学习 JavaScript 一段时间了,那么您之前可能听说过“异步”这个术语。 这是因为 JavaScript 是一种异步语言……但这到底意味着什么?在本文中,我希望向您展示这个概念并不像听起来那么困...

  • 4

    一文看懂JS异步编程,回调、Promise、Generator、async/await用法详解 | Lenix Blog JavaScript是一种单线程的编程语言,需要通过异步的方式才能获得较高的性能...

  • 5

    之前文章也有介绍给useState,包括手写一个useState,但是都没有介绍useState 异步回...

  • 7
    • pkxpp.github.io 1 year ago
    • Cache

    Lua实现http的异步回调

    Lua实现http的异步回调 想用lua实现与http服务器的通信,请求一些数据会回来,默认lua.socket.http是同步的,所以想弄一个异步的方式 lua 5.1 以下是同步的代码,其中http.requ...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK