java nio epoll_Java NIO 選擇器(Selector)的內部實現(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983

之前強調這么多關于linux內核的poll及epoll,無非是想讓大家先有個認識:

Java NIO中的選擇器依賴操作系統內核的這些系統調用,我們這里只講解與linux內核相關的NIO實現,當然,windows或其他操作系統實現大體上是類似的,相信大家也可以觸類旁通。

那么,本文從這里將從簡到難,一步一步為大家講解選擇器的點點滴滴吧。

選擇器的宏觀理解

“有這么一種檢查員,她工作在養雞場,每天的工作就是不停的查看特定的雞舍,如果有雞生蛋了,或者需要喂食,或者有雞生病了,就把相應信息記錄下來,這樣一來,雞舍負責人想知道雞舍的情況,只需要到檢查員那里查詢即可,當然,雞舍負責人得事先告知檢查員去查詢哪些雞舍。“

以上這段話即為選擇器所做工作的一個比喻,實際上選擇器為通道服務,通道事先告訴選擇器:“我對某些事件感興趣,如可讀、可寫等“,選擇器在接受了一個或多個通道的委托后,開始選擇工作,它的選擇工作就完全交給操作系統,linux下即為poll或epoll。

選擇器的創建

當調用Selector.open()時,選擇器通過專門的工廠SelectorProvider來創建Selector的實現,SelectorProvider屏蔽了不同操作系統及版本創建實現的差異性。具體實現代碼如下:

java.nio.channels.Selector

public static Selector open() throws IOException {

return SelectorProvider.provider().openSelector();

}

因為SelectorProvider本身為一個抽象類,通過調用provider()提供對應的Provider實現,如PollSelectorProvider、EPollSelectorProvider

java.nio.channels.spi.SelectorProvider

public static SelectorProvider provider() {

synchronized (lock) {

if (provider != null)

return provider;

return (SelectorProvider)AccessController

.doPrivileged(new PrivilegedAction() {

public Object run() {

if (loadProviderFromProperty())

return provider;

if (loadProviderAsService())

return provider;

provider = sun.nio.ch.DefaultSelectorProvider.create();

return provider;

}

});

}

}

默認的Provider實現即為DefaultSelectorProvider,通過調用create(),得到具體的SelectorProvider

sun.nio.ch.DefaultSelectorProvider

public static SelectorProvider create() {

PrivilegedAction pa = new GetPropertyAction("os.name");

String osname = (String) AccessController.doPrivileged(pa);

if ("SunOS".equals(osname)) {

return new sun.nio.ch.DevPollSelectorProvider();

}

// use EPollSelectorProvider for Linux kernels >= 2.6

if ("Linux".equals(osname)) {

pa = new GetPropertyAction("os.version");

String osversion = (String) AccessController.doPrivileged(pa);

String[] vers = osversion.split("\\.", 0);

if (vers.length >= 2) {

try {

int major = Integer.parseInt(vers[0]);

int minor = Integer.parseInt(vers[1]);

if (major > 2 || (major == 2 && minor >= 6)) {

return new sun.nio.ch.EPollSelectorProvider();

}

} catch (NumberFormatException x) {

// format not recognized

}

}

}

return new sun.nio.ch.PollSelectorProvider();

}

這是linux操作系統下的DefaultSelectorProvider的實現,可以看到,如果內核版本>=2.6則,具體的SelectorProvider為EPollSelectorProvider,否則為默認的PollSelectorProvider

結合上文,可以猜測一下EPollSelectorProvider提供的Selector肯定是與內核epoll有關的,PollSelectorProvider提供的

Selector肯定是與poll有關的。的確如此:

sun.nio.ch.EPollSelectorProvider

public AbstractSelector openSelector() throws IOException {

return new EPollSelectorImpl(this);

}

sun.nio.ch.PollSelectorProvider

public AbstractSelector openSelector() throws IOException {

return new PollSelectorImpl(this);

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Next.js 7發布,構建速度提升40%

Next.js團隊發布了其開源React框架的7版本。該版本的Next.js主要是改善整體的開發體驗,包括啟動速度提升57%、開發時的構建速度提升40%、改進錯誤報告和WebAssembly支持。\\Next.js是一個React框架,它的主要目標是在生產環境中提供出色的性能和良好的開發…

《Java多線程編程核心技術》讀后感(十五)

線程的狀態 線程對象在不同的運行時期有不同的狀態,狀態信息就存在與State枚舉類中。 驗證New,Runnable,Terminated new:線程實例化后還從未執行start()方法時的狀態 runnable:線程進入運行的狀態 terminated:線程被銷毀時的狀態 …

隊列(queue)

隊列(queue)和棧一樣支持push和pop兩個操作。但與棧不同的是,pop兩個操作。但與棧的不同的是,pop完成的不是取出最頂端的元素,而是最底端的元素。也就是說最初放入的元素能夠最先被取出(這種行為被叫做FIFO:First In First Out,即…

一題多解,ASP.NET Core應用啟動初始化的N種方案[上篇]

ASP.NET Core應用本質上就是一個由中間件構成的管道,承載系統將應用承載于一個托管進程中運行起來,其核心任務就是將這個管道構建起來。在ASP.NET Core的發展歷史上先后出現了三種應用承載的編程方式,而且后一種編程模式都提供了針對之前編程…

java程序猿面試問缺點怎么回答_JAVA程序員面試32問,你能回答多少題

第一,談談final, finally, finalize的區別。第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?第三,Static Nested Class 和 In…

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService的關閉shutdown和awaitTermination為接口ExecutorService定義的兩個方法,一般情況配合使用來關閉線程池。 方法簡介shutdown方法:平滑的關閉ExecutorService,當此方法被調用時,ExecutorService停止接收新的任務并且…

WPF 簡單模仿 VSCode 界面布局

WPF 簡單模仿 VSCode 界面布局本文經原作者授權以原創方式二次分享,歡迎轉載、分享。WPF 簡單模仿 VSCode 界面布局作者:弈虎-呂女士會翻墻原文鏈接: https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友這幾天自己寫的 WPF 簡…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比較2個lob存儲的數據,比較的方式是從指定偏移量開始,對指定數量的字符或者字節進行比較。 2如果比較內容相同,返回0,否則返回-1或1. 3如果參數設置有誤或不合…

linux 下 mysql默認表_linux環境下mysql默認是區分表名大小寫的

在linux環境下,mysql默認表明是區分大小寫的,我們可以查看全局變量發現:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…

dot-- 資源匯總

http://graphviz.org/doc/info/attrs.htmlhttp://graphs.grevian.org/http://graphs.grevian.org/examplehttp://www.linuxdevcenter.com/pub/a/linux/2004/05/06/graphviz_dot.html轉載于:https://www.cnblogs.com/itzxy/p/7860276.html

兩將軍問題和TCP三次握手

兩將軍問題,又被稱為兩將軍悖論、兩軍問題, 是一個經典的計算機思想實驗。首先, 為避免混淆,我們需要認識到兩將軍問題雖然與拜占庭將軍問題相關,但兩者不是一個東西。拜占庭將軍問題是一個更通用的兩將軍問題版本&…

微信小程序開發系列五:微信小程序中如何響應用戶輸入事件

2019獨角獸企業重金招聘Python工程師標準>>> 微信小程序開發系列教程 微信小程序開發系列一:微信小程序的申請和開發環境的搭建 微信小程序開發系列二:微信小程序的視圖設計 微信小程序開發系列三:微信小程序的調試方法 微信小程序…

理解Object.defineProperty的作用

Object.defineProperty 是vue中雙向綁定的基礎。vue是通過數據劫持的方式來做數據綁定的,最核心的方法是通過 Object.defineProperty()方法來實現對屬性的劫持,達到能監聽到數據的變動。要實現數據的雙向綁定, 當使用存取器描述屬性的特性的時…

java.lang包有哪些類_Java中Lang包的工具類有哪些

Java中Lang包的工具類有哪些發布時間:2020-12-08 16:15:36來源:億速云閱讀:76作者:Leah今天就跟大家聊聊有關Java中Lang包的工具類有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總…

直播修仙:使用.NET 的 WebView2 如何獲取請求的響應內容,以微信直播的互動直播為例...

背景近幾年直播行業快速發展,門檻也越來越低,越來越的人涌入直播大軍。不得不說,直播不僅帶來了更多的娛樂消遣,還提供了一個新型的就業方式。說起直播的類型,有一個非常小眾的娛樂直播,沒有主播&#xff0…

2017年我的閱讀書單

2017年我正在看或者已經看完的書單,基本上都是紙質書,主要是長時間閱讀也不傷眼。由于現階段的主要工作是 DevOps 和運維管理,所以涉及運維方面的書我沒有再細看,如果是工作用到的話會稍為翻閱下。主要還是看運維開發和 Python 及…

web第6次作業position

position 屬性指定了元素的定位類型。 position 屬性的五個值: static (靜態定位) HTML元素的默認值,即沒有定位,元素出現在正常的流中。 靜態定位的元素不會受到 top, bottom, left, right影響。 div.stati…

GeneralUpdate版本更新公告20221009

大家好我是juster,GeneralUpdate的開源項目作者。這次將發布GeneralUpdate兼容.NET MAUI和多平臺為核心的版本。經過國慶假期的打磨修復了大量開源社區開發者的提交的bug和不合理修改建議,重構、刪除了大量代碼和結構使用和上一個版本沒有太大變化。1.更…

實驗2 java_《Java程序設計》實驗2

1、使用java語言編程,從鍵盤輸入N個整數存儲到數組中,求數組所有元素的和、最大值和平均值。import java.util.Scanner;public class Program01{public static void main(String [] args){Scanner scanner new Scanner(System.in);System.out.println(&…

WPF遍歷當前容器中某種控件的方法

原文:WPF遍歷當前容器中某種控件的方法版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/m0_37591671/article/details/79528845 WPF遍歷當前容器中某種控件的方法 WPF遍歷當前容器中某種控件的方法1.目的:2.實現思…