48

Netty推荐addListener回调异步执行

 5 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.

说明

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”获取源码地址。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK