91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java NIO類庫Selector機制是什么

發布時間:2022-01-14 15:45:19 來源:億速云 閱讀:117 作者:iii 欄目:編程語言

這篇文章主要介紹“Java NIO類庫Selector機制是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java NIO類庫Selector機制是什么”文章能幫助大家解決問題。

迷惑不解 : 為什么要自己消耗資源?

令人不解的是為什么我們的Java的New I/O要設計成這個樣子?如果說老的I/O不能多路復用,如下圖所示,要開N多的線程去挨個偵聽每一個Channel (文件描述符) ,如果這樣做很費資源,且效率不高的話。那為什么在新的I/O機制依然需要自己連接自己,而且,還是重復連接,消耗雙倍的資源?

通過WEB搜索引擎沒有找到為什么。只看到N多的人在報BUG,但SUN卻沒有任何解釋。

下面一個圖展示了,老的IO和新IO的在網絡編程方面的差別。看起來NIO的確很好很強大。但似乎比起C/C++來說,Java的這種實現會有一些不必要的開銷。

它山之石 : 從Apache的Mina框架了解Selector

上面的調查沒過多長時間,正好同學趙錕的一個同事也在開發網絡程序,這位仁兄使用了Apache的Mina框架。當我們把Mina框架的源碼研讀了一下后。發現在Mina中有這么一個機制:

1)Mina框架會創建一個Work對象的線程。

2)Work對象的線程的run()方法會從一個隊列中拿出一堆Channel,然后使用Selector.select()方法來偵聽是否有數據可以讀/寫。

3)最關鍵的是,在select的時候,如果隊列有新的Channel加入,那么,Selector.select()會被喚醒,然后重新select***的Channel集合。

4)要喚醒select方法,只需要調用Selector的wakeup()方法。

對于熟悉于系統調用的C/C++程序員來說,一個阻塞在select上的線程有以下三種方式可以被喚醒:

1)  有數據可讀/寫,或出現異常。

2)  阻塞時間到,即time out。

3)  收到一個non-block的信號。可由kill或pthread_kill發出。

所以,Selector.wakeup()要喚醒阻塞的select,那么也只能通過這三種方法,其中:

1)第二種方法可以排除,因為select一旦阻塞,應無法修改其time out時間。

2)而第三種看來只能在Linux上實現,Windows上沒有這種信號通知的機制。

所以,看來只有***種方法了。再回想到為什么每個Selector.open(),在Windows會建立一對自己和自己的loopback的TCP連接;在Linux上會開一對pipe(pipe在Linux下一般都是成對打開),估計我們能夠猜得出來——那就是如果想要喚醒select,只需要朝著自己的這個loopback連接發點數據過去,于是,就可以喚醒阻塞在select上的線程了。

真相大白 : 可愛的Java你太不容易了

使用Linux下的strace命令,我們可以方便地證明這一點。參看下圖。圖中,請注意下面幾點:

1)  26654是主線程,之前我輸出notify the select字符串是為了做一個標記,而不至于迷失在大量的strace log中。

2)  26662是偵聽線程,也就是select阻塞的線程。

3)  圖中選中的兩行。26654的write正是wakeup()方法的系統調用,而緊接著的就是26662的epoll_wait的返回。

Java NIO類庫Selector機制是什么

從上圖可見,這和我們之前的猜想正好一樣。可見,JDK的Selector自己和自己建的那些TCP連接或是pipe,正是用來實現Selector的notify和wakeup的功能的。

這兩個方法完全是來模仿Linux中的的kill和pthread_kill給阻塞在select上的線程發信號的。但因為發信號這個東西并不是一個跨平臺的標準(pthread_kill這個系統調用也不是所有Unix/Linux都支持的),而pipe是所有的Unix/Linux所支持的,但Windows又不支持,所以,Windows用了TCP連接來實現這個事。

關于Windows,我一直在想,Windows的防火墻的設置是不是會讓Java的類似的程序執行異常呢?呵呵。如果不知道Java的SDK有這樣的機制,誰知道會有多少個程序為此引起的問題度過多少個不眠之夜,尤其是Java程序員。

關于“Java NIO類庫Selector機制是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河曲县| 翼城县| 喀喇| 大冶市| 尼玛县| 民丰县| 如东县| 开鲁县| 台东县| 郓城县| 岢岚县| 项城市| 麻阳| 长汀县| 曲麻莱县| 昆山市| 焉耆| 东乡族自治县| 平顶山市| 寻甸| 克山县| 定陶县| 中山市| 玛纳斯县| 黎城县| 临安市| 望城县| 蓝山县| 晴隆县| 沧源| 大同市| 萝北县| 玉田县| 游戏| 顺义区| 巨鹿县| 依兰县| 莫力| 青冈县| 克拉玛依市| 西藏|