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原始碼地址:ofollow,noindex" target="_blank"> nettydemo ,或者公號回覆“Netty”獲取原始碼地址。