java selector 源码_Java NIO核心组件-Selector和Channel

昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现.

那今天我们就来介绍一下, Java NIO中的核心组件, Selector和Channel.这两个组件,对于熟悉Java OIO,而不熟悉Java NIO的朋友来说,理解其作用是极其不易的.

前提条件

在阅读这篇文章之前,如果各位不熟悉甚至没有听说过IO multiplexing中的epoll,请务必花时间去了解一下.了解了它们之后,就很容易理解Java NIO的实现了.

这里我们讲解的是Linux版本且内核版本大于2.6的Java NIO的实现,对于其他的系统或者内核版本较低的Java NIO,其具体实现是不一样的.

举例来说, Linux 内核版本大于等于2.6的Java NIO是采用epoll来实现的.而Linux内核版本小于2.6的Java NIO,则是采用poll来实现的.

Selector和Channel

Selector和Channel的关系,如下图所示:

a4d35d218235

各位如果了解过epoll的话,应该知道epoll_create操作会创建一个需要被监听的file descriptor.然后,epoll_ctl操作会为告诉内核,需要监听一个file descripitor的什么事件.最后,使用epoll_wait来告诉内核开始监听.

这里我们就可以把Selector比作epoll中的内核.把Channel比作epoll_create操作创建的file descriptor.这样就很容易理解了吧.

因为Java NIO实际上是给我们对IO multiplexing进行了封装,隐藏了其底层的实现.所以我们完全可以这样来理解.

贴出在Java NIO tutorial中看到的一个图片,

a4d35d218235

对于这张图片,我实在是不能苟同其说法.我们可以看到,在这张图片中,我们可以看到,一个线程中只有一个Selector,每个Selector负责监控三个Channel.而实际上,一个线程中,并不是必须只能有一个Selector.一个Selector也不是只能注册三个Channel.

在AbstractSelector的源码中,我们可以看到,实际上它只维护了一个不再监听的Channel的集合:

a4d35d218235

我们查看具体的Selector的父类,SelectorImpl,中的register方法的实现.跟具体的Selector实现相关的类,在JDK提供的src.zip源码包中是找不到的.这里使用CFR反编译器反编译rt.jar包.从中找到其实现.

a4d35d218235

我们可以看到,它会把Channel进一步封装成SelectionKeyImpl.然后使用implRegister方法来实现具体的注册过程.从SelectorImpl的源码中,我们同样可以看到,implRegister方法是一个抽象方法,需要其子类来实现具体的注册过程.

这里我们感兴趣的子类是EPollSelectorImpl,我们查看其源码,可以看到其中维护了一个从file descriptor到SelectionKeyImpl的Map.我们刚刚也提到了,SelectionKeyImpl中,包装了一个Channel,

a4d35d218235

我们从EPollSelectorImpl的implRegister方法中,也没有看到会对Map这个表示EPollSelectorImpl维护的Channel的Map进行尺寸限制的操作.即并没有限制一个EPollSelectorImpl可以注册的Channel的数量.

a4d35d218235

反而是在Channel中,维护了它向Selector注册时,Selector给其返回的SelectionKey的集合.相当于维护了它已经注册的Selector的集合.

a4d35d218235

我们查看AbstractSelectableChannel的向Selector注册的源码:

a4d35d218235

我们可以看到,它会把Selector给它返回的SelectionKey加入到上面我们说过的那个集合中,我们看看addKey()方法的具体实现:

a4d35d218235

在这里我们就可以看到,默认情况下,Channel会创建一个容量为3的表示它注册的Selector的集合.当它需要向更多的Selector注册时,则对这个集合进行扩容.

而并没有提到一个Selector中最多可以注册多少个Channel.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 1542】Atlantis (线段树,扫描线)

题干: There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend…

python 底层原理processpoolexecutor_python 多进程并行编程 ProcessPoolExecutor的实现

使用 ProcessPoolExecutorfrom concurrent.futures import ProcessPoolExecutor, as_completedimport random斐波那契数列当 n 大于 30 时抛出异常def fib(n):if n > 30:raise Exception(can not > 30, now %s % n)if n < 2:return 1return fib(n-1) fib(n-2)准备数组…

【HDU - 5700】【51nod - 1672】 区间交(贪心,STLset 或线段树第k大)

题干&#xff1a; 小A有一个含有n个非负整数的数列与m个区间&#xff0c;每个区间可以表示为li,ri。 它想选择其中k个区间&#xff0c; 使得这些区间的交的那些位置所对应的数的和最大。&#xff08;是指k个区间共同的交&#xff0c;即每个区间都包含这一段&#xff0c;具体可…

python 爬虫 博客园_Python爬虫爬取博客园作业

分析一下他们的代码&#xff0c;我在浏览器中对应位置右键&#xff0c;然后点击检查元素&#xff0c;可以找到对应部分的代码。但是&#xff0c;直接查看当前网页的源码发现&#xff0c;里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码&#xff0c;…

【洛谷 - P1507 】NASA的食物计划(二维费用背包,dp)

题干&#xff1a; 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生&#xff0c;谁也无法保证,在遇到这类航天问题时,解决方法也许只能让航天员出仓维修,但是多次的维修…

java 与 xml_xml与java对象转换

public static void main(String[] args) {//java bean 转 xmlDept d new Dept();List staffs new ArrayList<>();Staff s1 new Staff("wuyun", 20);Staff s2 new Staff("lilei", 22);staffs.add(s1);staffs.add(s2);d.setDeptName("开放平…

【蓝桥杯官网试题 - 算法训练 】P0502(乱搞,tricks)

题干&#xff1a; 编写一个程序&#xff0c;读入一组整数&#xff0c;这组整数是按照从小到大的顺序排列的&#xff0c;它们的个数N也是由用户输入的&#xff0c;最多不会超过20。然后程序将对这个数组进行统计&#xff0c;把出现次数最多的那个数组元素值打印出来。如果有两个…

python循环中的else_python 循环中else的简单示例

导读热词对python这个高级语言感兴趣的小伙伴&#xff0c;下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧&#xff01;众多语言中都有if else这对条件选择组合&#xff0c;但是在python中还有更多else使用的地方&#xff0c;比如说循环for&#xff0c;或者while都可以和els…

【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)

题干&#xff1a; 问题描述 给定一个正整数n&#xff0c;求一个正整数p&#xff0c;满足p仅包含n的所有素因子&#xff0c;且每个素因子的次数不大于1 输入格式 一个整数&#xff0c;表示n 输出格式 输出一行&#xff0c;包含一个整数p。 样例输入 1000 样例输出 10 数…

【蓝桥杯官网试题 - 算法提高】 贪吃的大嘴 (多重背包转0-1背包,dp)

题干&#xff1a; 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕. 输…

java applet socket_Java swing applet中使用的套接字

小编典典基于此示例&#xff0c;这是一个使用Swing的简单网络客户端/服务器对。请注意与正确同步有关的一些问题&#xff1a;GUI本身是使用事件分配线程构建的invokeLater()。此外&#xff0c;代码还依赖的线程安全性append()。最后&#xff0c;它结合了文章Text Area Scrollin…

【牛客 - 370A】签到题(线段树扫描线 或 STLset)(求线段并)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/A 来源&#xff1a;牛客网 恭喜你找到了本场比赛的签到题&#xff01; 为了让大家都有抽奖的机会&#xff0c;只需要复制粘贴以下代码&#xff08;并且稍微填下空&#xff09;即可 AC&#xff1…

java sqlserver分页查询_SQLServer之常用的分页查询语句介绍

在SqlServer中&#xff0c;分页查询是经常用到的查询语句&#xff0c;一个好的分页查询语句&#xff0c;不能能将代码省略&#xff0c;还能提高运行效率&#xff0c;下面我们来探讨一下SQLServer中的分页查询语句。具体的业务逻辑是这样的&#xff0c;我数据库中有100条数据&am…

【牛客 - 370H】Rinne Loves Dynamic Graph(分层图最短路)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/370/H 来源&#xff1a;牛客网 Rinne 学到了一个新的奇妙的东西叫做动态图&#xff0c;这里的动态图的定义是边权可以随着操作而变动的图。 当我们在这个图上经过一条边的时候&#xff0c;这个图上所…

中位数及带权中位数问题(转)

先从一到简单的题看起&#xff1a; 士兵站队问题 在一个划分成网格的操场上&#xff0c;n个士兵散乱地站在网格点上。网格点由整数坐标(x,y)表示。士兵们可以沿网格边上、下、左、右移动一步&#xff0c;但在同一时刻任一网格点上只能有一名士兵。按照军官的命令&#xff0c;…

java编写学籍管理系统_java学籍管理系统源代码.doc

java学籍管理系统源代码package zuoye;//主类import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.Hashtable;public class ManagerWindow extends JFrame implements ActionListener{InputStudent 基本信息录入null;ModifySit…

*【SGU - 114】Telecasting station (带权中位数 或 三分)

题干&#xff1a; Every city in Berland is situated on Ox axis. The government of the country decided to build new telecasting station. After many experiments Berland scientists came to a conclusion that in any city citizens displeasure is equal to product…

java的et5_Javascript与java相同的3des加密(使用etdesede/CBC/PKCS5Padding )

在某个项目中&#xff0c;需要开发一个与native相对应的web前端app&#xff0c;后台用的是java restful接口&#xff0c;请求数据时需要用的3des加密。如果想要请求接口&#xff0c;则需要javascript的加密与java相同&#xff0c;于是在baidu与google进行了大量搜索&#xff0c…

*【HDU - 4272 】LianLianKan (dfs 或 状压dp,贪心不行)

题干&#xff1a; I like playing game with my friend, although sometimes looks pretty naive. Today I invent a new game called LianLianKan. The game is about playing on a number stack. Now we have a number stack, and we should link and pop the same element…

java中的values函数_巧用valueat函数(快逸免费版)

在制作报表时&#xff0c;经常会遇到将数据库里一列数据按照条件取值后&#xff0c;分为多列显示的需求&#xff0c;例如&#xff1a;数据库中有一列名为type的数据&#xff0c;在报表中&#xff0c;第一列选择type为1的数据&#xff0c;第二列选择type为2的数据。由于受到扩展…