Java NIO网络编程之Selector
概述
Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接(多路复用),就会用到Selector(多路复用器/选择器)。
Selector能够检测多个注册通道channel上是否有事件发生(多个Channel以事件的方式注册多同一个Selector),类似基于epoll的多路复用,如果有事件发生,便获取事件,然后针对每个事件进行相应的处理,这个月就可以用单线程去处理多个连接和请求。
只有在连接/通道真正有读写事件发生时,才会进行读写,就大大减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程。避免多线程之间上下文切换的开销。
说明:
- 当线程从某客户端Socket通道进行读写数据时,若没有数据可用(也就是数据没有准备好),该线程不会阻塞在这里,而是会执行其他任务,直到触发读写完成的事件。
- 线程通常将非阻塞IO的空闲时间用于执行其他通道上的IO操作,所以单个线程可以管理多个输入和输出通道。
- 由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致线程挂起。
- 1个IO线程可以并发处理N个客户端连接和读写操作,这从根本上解决了传统同步阻塞IO的一连接一线程模型,架构的性能、弹性伸缩力和可靠性得到极大的提升。
就是Selector会监控注册到它那里的channel,比如有一个如果一直没有事件发生,线程就会空闲着,如果发生了事件,比如OP_ACCEPT事件,Selector就会监控到返回,然后处理,处理完又监控这段时间发生的时间。
对基于epoll的多路复用有所理解的话,理解Selector应该不是难事。
常用API:
//创建并打开一个Selector
public static Selector open()//查看当前Selector是否处于打开状态
public abstract boolean isOpen();//获取在该selector上注册的所有SelectionKey集合
public abstract Set<SelectionKey> keys();//获取在发生了某个事件的SelectionKey集合
public abstract Set<SelectionKey> selectedKeys();//监控事件发生,这个不会阻塞,会立马返回,返回的是触发事件的个数。可能为0
public abstract int selectNow() //监控事件发生,如果在timeout期间有一个以上的事件发生,就会返回,或者会阻塞到timeout后返回,返回发生的事件个数。可能为0
public abstract int select(long timeout)//会一直阻塞,直到有一个以上的事件发生
public abstract int select()//唤醒,可以唤醒处于select阻塞状态的selector
public abstract Selector wakeup();//关闭selector
public abstract void close()
Java NIO网络编程之Selector相关推荐
- java NIO网络编程之SelectionKey
概述 SelectionKey是java.nio.channels包下的一个类,主要用于绑定selector和chanel之间的关联(注册关系). SelectionKey定义了selector监控事 ...
- Java:网络编程之UDP的使用
java.net 类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net 类 DatagramPacket 此类表示数 ...
- Java网络编程之NIO编程(待补充)
Java网络编程之NIO编程(待补充) 学习网站1:http://ifeve.com/java-nio-all/ 学习网站2:http://www.ibm.com/developerworks/cn/ ...
- 原生JDK网络编程之NIO篇
原生JDK网络编程之NIO篇 一.NIO是什么 NIO库是在JDK1.4中引入的.NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的.面向块的I/O. NIO可以称为 no-b ...
- java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...
- Java网络编程之TCP、UDP
Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...
- java网络编程之TCP通讯
java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...
- 浅谈Java网络编程之Socket (2)
<浅谈Java网络编程之Socket (1)>中我们已经和大家说到客户端的网络编程,下面和大家分享的是服务器的实现代码. import java.net.*; import java.io ...
- 浅谈Java网络编程之Socket (1)
和大家一起分享的是Java网络编程之Socket.在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是get ...
最新文章
- python爬虫实例-python使用百度进行爬虫简单学习例子
- XPS reader for Silverlight
- lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器
- SAP ABAP Netweaver里的SE80事务码是如何响应用户请求的
- SecureCRT 中 python 命令行使用退格键(backspace)出现 ^H 解决办法
- Javamysql语法转化oracle_MySQL与Oracle的语法区别详细对比
- python 旅游_Python带你来一次说走就走的环球旅行
- 男朋友花3000元买一块电脑显卡,他是怎么想的?
- debian6 snmpd 安装配置
- 第一次作业-四则运算
- python的drop duplicates,Python的pandas中,drop_duplicates函数怎么根据索引来去重
- 10个常用的python可视化工具
- 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
- java SNS网络系统,Java源码:SNS社交管理系统JEESNS v1.3
- b和kb的换算_b和bit换算(KB转换G)
- Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
- Unity 3D系列 摄像机围绕主角进行旋转、缩放
- 北京汽车转型背后:“大北汽”棋局中的变与不变
- c语言程序设计66页,C语言程序设计
- 一份完整的app产品运营推广方案,app推广运营的方法(一)
热门文章
- 13.相机和图像——缩放和移动是不一样的,移动变焦镜头,镜头并不完美,镜像系统_5
- mysql sdi_MySQL 8.0新特性: 数据字典
- 如何在服务器运行aspx_ASP.NET开发实战——(四)MVC是如何运行?它的生命周期是什么?...
- 2017.8.24 快速傅里叶 思考记录
- 2017.4.23 一元三次方程求解 思考记录
- bes2300 tws配对_tws 耳机春天来了!
- 【英语学习】【WOTD】resurrection 释义/词源/示例
- 两空间异面直线公垂线及交点坐标的求解过程
- Android解析SVG
- mysql数据库 二十一练习题 及答案 (mysql练习题)