"但是它有一個非常大的優點,就是我們始終只有一個線程,并沒有啟動額外的線程來處理每個連接的事務,解決了 BIO 線程無限增加的問題,所以,NIO 是非常高效的"
這句話不太理解,BIO那個程序完全也可以采用單線程的處理方式啊,這樣就不存在創建大量線程的缺點了,這段NIO再消費客服端請求的時候采用的是單線程阻塞的方式,前一章的BIO程序也是可以去掉線程池的,所以從這方面去分析,也看不出誰更高效,因為都是阻塞IO。退一步講,上一章BIO采用的是線程池,那么處理客服端請求是可以并行處理的,它的性能反而更加的高效才對,這就很矛盾了。
Mr_Raymond
想問下老師,我想學Netty,手頭上正好有《TCP:IP詳解:協議卷1》《Java網絡編程》,可以直接學Netty呢? 還是先把這兩本書看完在學? 或者是邊學Netty,遇到不明白的再去針對性的從這兩本書里找一些資料呢?
講師回答 / 彤哥讀源碼
同學,你好,《TCP/IP詳解》更偏底層,《Java網絡編程》更偏傳統的BIO網絡通信,Netty更偏向于NIO編程,在計算機領域,往往越是底層的東西越枯燥,如果你想快速入手Java網絡編程或者想快速能看懂其他開源框架的源碼,我建議先從Netty開始;如果你想把IO/NIO這塊的東西都搞明白,可以先看《Java網絡編程》再看Netty,同時還要把IO/NIO這塊的源碼看懂;如果你想深入理解計算機底層關于網絡通信這塊的處理,可以看看《TCP/IP詳解》。
qq_達達_14
通俗易懂,愛了愛了!
講師回答 / 彤哥讀源碼
愛了愛了~~
慕九州4486665
講得非常有趣,給作者點贊!
講師回答 / 彤哥讀源碼
多謝夸獎,哈哈^^
張三豐1
"但是它有一個非常大的優點,就是我們始終只有一個線程,并沒有啟動額外的線程來處理每個連接的事務,解決了 BIO 線程無限增加的問題,所以,NIO 是非常高效的" 這句話不太理解,BIO那個程序完全也可以采用單線程的處理方式啊,這樣就不存在創建大量線程的缺點了,這段NIO再消費客服端請求的時候采用的是單線程阻塞的方式,前一章的BIO程序也是可以去掉線程池的,所以從這方面去分析,也看不出誰更高效,因為都是阻塞IO。退一步講,上一章BIO采用的是線程池,那么處理客服端請求是可以并行處理的,它的性能反而更加的高效才對,這就很矛盾了。
講師回答 / 彤哥讀源碼
首先,非常感謝您的提問。 然后,請看下面這段代碼: while ((msg = reader.readLine()) != null) { System.out.println("receive msg: " + msg); } 始終要記著,我們這里講的是TCP長連接,如果BIO使用單線程,請思考如何持續地讀取多個客戶端發送過來的數據?即使使用線程池,假設為10個線程,如何知道哪個客戶端發來了數據?
慕粉花小魚
看了不少專欄,發現作者的寫作風格,非常有意思,贊了
講師回答 / 彤哥讀源碼
愛了愛了^^
MartinCode
寫的不錯!
講師回答 / 彤哥讀源碼
我就當是夸我了^^
慕粉花小魚
請問,在IO 多路復用中,委托美女,向美女詢問菜好了沒有的時候,到底能不能玩手機?
講師回答 / 彤哥讀源碼
此時,你可以玩手機,但是美女去詢問廚房的時候她是阻塞的,到了第二階段,你去端菜的時候,你就是阻塞的了,就不能玩手機了。兩個階段都是阻塞的,對象不一樣。少玩手機多學習,奧力給!
桂林山水甲天下
嗯非常對 最重要的還是需要掌握底層核心知識,這些核心知識掌握了,學習其他東西真的能事半功倍。老師講解的源代碼和核心原理適合入門學習嗎?
講師回答 / 彤哥讀源碼
可以的,源碼注釋的非常詳細,原理也有大量的圖幫助理解,更有Java底層的知識幫助你理解消化。
小愛仙子
老師寫得可以啊,學起來~~
講師回答 / 彤哥讀源碼
必須滴~~
慕九州4486665
我的理解: Reactor主從模式和變異的Reactor模式的區別如下: 在我看來好像他倆的唯一區別就是主從模式中,子Reactor將read/send事件與IO處理分開了,IO處理放到了線程池中進行;而變異的Reactor模式則是將read/send事件與IO處理作為一個整體,然后放到線程池中進行; 第一個問題: 我如上的理解正確嗎? 第二個問題: 主從和變異的兩種方式哪個效率更高呢?為什么Netty選擇的是變異的Reactor模式呢?
講師回答 / 彤哥讀源碼
1. 你的理解是對的,不過概念錯了,IO處理是read和send,decode/process/encode是業務處理,將業務處理放到單獨的線程池中的好處是,業務處理不會影響到IO事件的處理,線程池也可以起到一定的緩沖作用。2. 默認情況下,我們將IO事件和業務處理放一起,是因為業務處理邏輯非???,不需要再另建一個線程池專門處理業務。如果業務處理比較耗時(比如,業務有讀取數據庫、網絡IO等耗時操作),或者一些特殊情況(比如,類似于Redis單線程處理業務邏輯),還是需要另建業務線程池的。