1. 程式人生 > >Netty推薦addListener回撥非同步執行

Netty推薦addListener回撥非同步執行

說明

Netty推薦使用addListener的方式來回調非同步執行的結果,這種方式優於Future.get,能夠更精確地把握非同步執行結束的時間。

錯誤理解使用addListener的方式

程式碼如下:

程式碼執行結果:

疑惑: 很疑惑啊,按照上面Netty推薦使用addListener的方式來回調非同步執行的結果,這種方式優於Future.get,能夠更精確地把握非同步執行結束的時間。而且也停頓了5s了,為什麼還是順序執行的呢?

感謝閃電俠、芋艿、曉峰的熱心解答

分析

這段程式碼 怎麼執行都是順序執行,不阻塞 最後,reactor執行緒裡面都是同步的。

我們來跟蹤程式碼進行檢視:

關鍵在這裡,執行完成write之後返回promise。

如果是reactor那麼就順序執行,否則就加入佇列等待後續執行(如果是順序的就是等執行完成返回,如果是加入佇列就是非同步)

這裡重點不在writeAndFlush,先分析同步是執行的情況,非同步的下面正確方式會分析,如果是同步方式:

也就是設定了值,之後promise之後返回。

那麼:

所有就變成了java裡面最普通的程式碼,一個執行緒程式碼從上到下執行。也解釋了為什麼沒有走非同步情況了。

正確理解使用addListener的方式

不在reactor執行緒裡面執行,就可以做到最開始提到的:Netty推薦使用addListener的方式來回調非同步執行的結果,這種方式優於Future.get,能夠更精確地把握非同步執行結束的時間。

執行效果如下:

繼續進行分析:

關鍵在這裡,執行完成write之後返回promise。

由於是非同步直接返回,其實isDone為false,之後addListener就很快新增完成,就執行下面語句了。

這裡也可以看到是writeAndFlush執行完成之後呼叫回撥事件,這樣才是真正做到了非同步執行。

總結

由於之前理解不深刻,感謝閃電俠、芋艿、曉峰的熱心解答,現在開朗多了,Netty繼續學習中……,希望今天文章對你有所有收穫!!!

文章github原始碼地址:nettydemo,或者公號回覆“Netty”獲取原始碼地址。


如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!