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