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 ...
最新文章
- DSAPI多功能组件编程应用-DS提示气泡
- 【缅怀妈妈系列诗歌】之六:妈妈,您怎能舍得安心离去
- redis RedisTemplate实现分布式锁
- layui表格合并单元格多表_layui动态表格之合并单元格
- HDU多校4 - 6813 Last Problem(构造)
- pip报错Failed to establish a new connection: [Errno -3] Temporary failure in name resolution‘,)‘
- 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)
- python正则表达式笔记之字符集合的使用
- ERROR 1820: You must reset your password using ALTER USER statement before executing this statement
- DBeaver连接SqlServer报“The server selected protocol version TLS10 is not accepted by client prefere”的错误
- 改变iOS app的icon(iOS10.3)
- Linux中文件权限(有图详细讲解)
- 如何实现远程给PLC上下载程序?
- 1055 集体照 (25 分)
- linux mentohust dhcp,校园网锐捷 openwrt mentohust 成功开启IPv6
- java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法
- Stm32F4XX开启FPU浮点运算
- 单片机继电器控制实验程序C语言,用单片机通过继电器来控制电热水器的实验...
- 计算机2.0培训心得,教育信息化20培训心得体会
- 8.3 bert的蒸馏方法概述