摘要:好了,目前還不難,我們起碼知道這個抽象類上面的部分關系,因此當然也有自己的方法,如下。又來一個的供應商好吧,大佬們總是喜歡用一些設計模式的東西,沒錯,也是一個抽象類,這個現在不用太在意了。
前言
java nio,一個入門netty之前需要了解下的非阻塞I/O實現,傳統的Socket通信,啟動監聽后accept會一直處于阻塞狀態,那么如果你想要多個(并發)通信時,那么我們就需要多個線性去執行,而且還會存在一些無用線程占用我們的資源。
nio的Selector很好的解決了這個問題,它可以僅僅通過一個線程去跑多個連接,每個連接沒有資格去占用自己的線程,而是由Selector去分發。接下來讓我們一起來了解下作者的設計實現思路吧。
我也不是大神,大家有觀點也可以提出來。
啟動Selector使用過NIO的朋友都知道,要用就要先啟動Selector。
Selector selector = Selector.open();
沒錯,這樣一個非阻塞的功能就已經開始運行了,使用時間通知API以確定在一組非阻塞套接字中,哪些已經就緒能夠進行I/O相關的操作。
即一個單一線程處理多個并發的連接
源碼閱讀首先我們看看Selector這個類,它是一個抽象類,并沒有寫什么具體實現,畢竟是Mark Reinhold寫的,怎么可能那么快就讓你們看到實在的東西呢?
public abstract class Selector implements Closeable{}
現在起碼我們知道這個抽象類里面起碼open這個靜態方法,Selector還實現了Closeable接口,Closeable是java.io的一個關閉接口,它本身也繼承了java.lang的AutoCloseable。
public interface Closeable extends AutoCloseable{ public void close() throws IOException; } public interface AutoCloseable{ void close() throws Exception; }
好了,目前還不難,我們起碼知道Selector這個抽象類上面的部分關系,因此Selector當然也有自己的close方法,如下。
public abstract class Selector implements Closeable { //.... public abstract void close() throws IOException; }open方法
接下來才是重頭戲啦,open方法究竟做了啥,讓通信連接在一個線程就可以完好的處理,它就行啟動了什么大Boss。我有點喜歡這個作者了,他又一次讓我打開另一扇門。
public static Selector open() throws IOException { return SelectorProvider.provider().openSelector(); }
又來一個SelectorProvider?
Selector的供應商?好吧,大佬們總是喜歡用一些設計模式的東西,沒錯,SelectorProvider也是一個抽象類,這個現在不用太在意了。
SelectorProvider的構造方法,emmmm,大家看看就好
protected SelectorProvider() { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new RuntimePermission("selectorProvider")); }
SecurityManager(類似java安全的東西)、RuntimePermission(類似java權限的東西),大致就是非常安全的創建一個SelectorProvider。
回到原文,open方法調用了返回了一個Selector,是由SelectorProvider調用provider方法再調用openSelector而得到的。
provider方法我們再看看provider方法吧,我都快急死了。一進來就看到synchronized!額,線程鎖,保證線程安全的東西,我們理解主要的先,內容是這樣的。
public static SelectorProvider provider() { synchronized (lock) { if (provider != null) return provider; return AccessController.doPrivileged( new PrivilegedAction() { public SelectorProvider run() { if (loadProviderFromProperty()) return provider; if (loadProviderAsService()) return provider; provider = sun.nio.ch.DefaultSelectorProvider.create(); return provider; } }); } }
哇,又來。首先就容量理解啦,provider不為空就直接返回,這個provider是SelectorProvider本身的一個靜態成員
private static SelectorProvider provider = null;
當然第一次的時候一定是null的,然后就執行下面的方法,反正就是去判斷幾種情況后返回一個provider。創建時用到了java反射機制哦,有興趣的朋友去看看。
那么起碼我們知道他也是判斷情況后返回SelectorProvider。
openSelector方法public abstract AbstractSelector openSelector() throws IOException;
淺顯易懂,返回一個新的selector
沒錯,一個簡單的open就是告訴你,你需要通過調用SelectorProvider的方法來生成系統默認SelectorProvider并返回一個okay的Selector。
結尾emmmm,好像沒有真正的了解到如何通過一個線程來實現分發多個連接,不過不要緊,這么牛逼的NIO怎么可能一篇小文章就能說明白的?
下節繼續......
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76768.html
摘要:目錄源碼之下無秘密做最好的源碼分析教程源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端 目錄 源碼之下無秘密 ── 做最好的 Netty 源碼分析教程 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NI...
摘要:啟動然后一路執行到方法中,調用方法啟動線程。的執行流程中的方法是一個無限循環的線程,在該循環中主要做三件事情,如圖所示。而這個喚醒是沒有任何讀寫請求的,從而導致線程在做無效的輪詢,使得占用率較高。 上一篇文章,分析了Netty服務端啟動的初始化過程,今天我們來分析一下Netty中的Reactor線程模型在分析源...
摘要:目錄源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端源碼分析之一揭開神秘的紅蓋頭服務器 目錄 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 簡介 Java NIO 的前生今世 ...
摘要:目錄源碼之下無秘密做最好的源碼分析教程源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端 目錄 源碼之下無秘密 ── 做最好的 Netty 源碼分析教程 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NI...
摘要:如果偽類的參數不可以用轉換,則參數為字符串,用正則將字符串前后的或去掉,再賦值給最后執行回調,將解釋出來的參數傳入回調函數中,將執行結果返回。重寫的方法,改過的調用的是方法,在回調函數中處理大部分邏輯。 Selector 模塊是對 Zepto 選擇器的擴展,使得 Zepto 選擇器也可以支持部分 CSS3 選擇器和 eq 等 Zepto 定義的選擇器。 在閱讀本篇文章之前,最好先閱讀《...
閱讀 2930·2021-11-23 09:51
閱讀 3103·2021-11-15 11:39
閱讀 2985·2021-11-09 09:47
閱讀 2534·2019-08-30 13:49
閱讀 2117·2019-08-30 13:09
閱讀 3101·2019-08-29 16:10
閱讀 3509·2019-08-26 17:04
閱讀 995·2019-08-26 13:57