說明
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”獲取源碼地址。
如果讀完覺得有收獲的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!