概述

Java的NIO,用非阻塞的IO方式,可以用一个线程,处理多个客户端连接(多路复用),就会用到Selector(多路复用器/选择器)。

Selector能够检测多个注册通道channel上是否有事件发生(多个Channel以事件的方式注册多同一个Selector),类似基于epoll的多路复用,如果有事件发生,便获取事件,然后针对每个事件进行相应的处理,这个月就可以用单线程去处理多个连接和请求。

只有在连接/通道真正有读写事件发生时,才会进行读写,就大大减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程。避免多线程之间上下文切换的开销。

说明:

  1. 当线程从某客户端Socket通道进行读写数据时,若没有数据可用(也就是数据没有准备好),该线程不会阻塞在这里,而是会执行其他任务,直到触发读写完成的事件。
  2. 线程通常将非阻塞IO的空闲时间用于执行其他通道上的IO操作,所以单个线程可以管理多个输入和输出通道。
  3. 由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致线程挂起。
  4. 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相关推荐

  1. java NIO网络编程之SelectionKey

    概述 SelectionKey是java.nio.channels包下的一个类,主要用于绑定selector和chanel之间的关联(注册关系). SelectionKey定义了selector监控事 ...

  2. Java:网络编程之UDP的使用

    java.net  类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net  类 DatagramPacket 此类表示数 ...

  3. Java网络编程之NIO编程(待补充)

    Java网络编程之NIO编程(待补充) 学习网站1:http://ifeve.com/java-nio-all/ 学习网站2:http://www.ibm.com/developerworks/cn/ ...

  4. 原生JDK网络编程之NIO篇

    原生JDK网络编程之NIO篇 一.NIO是什么 NIO库是在JDK1.4中引入的.NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的.面向块的I/O.     NIO可以称为 no-b ...

  5. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  6. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  7. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...

  8. 浅谈Java网络编程之Socket (2)

    <浅谈Java网络编程之Socket (1)>中我们已经和大家说到客户端的网络编程,下面和大家分享的是服务器的实现代码. import java.net.*; import java.io ...

  9. 浅谈Java网络编程之Socket (1)

    和大家一起分享的是Java网络编程之Socket.在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是get ...

最新文章

  1. python爬虫实例-python使用百度进行爬虫简单学习例子
  2. XPS reader for Silverlight
  3. lstm 根据前文预测词_干货 | Pytorch实现基于LSTM的单词检测器
  4. SAP ABAP Netweaver里的SE80事务码是如何响应用户请求的
  5. SecureCRT 中 python 命令行使用退格键(backspace)出现 ^H 解决办法
  6. Javamysql语法转化oracle_MySQL与Oracle的语法区别详细对比
  7. python 旅游_Python带你来一次说走就走的环球旅行
  8. 男朋友花3000元买一块电脑显卡,他是怎么想的?
  9. debian6 snmpd 安装配置
  10. 第一次作业-四则运算
  11. python的drop duplicates,Python的pandas中,drop_duplicates函数怎么根据索引来去重
  12. 10个常用的python可视化工具
  13. 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
  14. java SNS网络系统,Java源码:SNS社交管理系统JEESNS v1.3
  15. b和kb的换算_b和bit换算(KB转换G)
  16. Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
  17. Unity 3D系列 摄像机围绕主角进行旋转、缩放
  18. 北京汽车转型背后:“大北汽”棋局中的变与不变
  19. c语言程序设计66页,C语言程序设计
  20. 一份完整的app产品运营推广方案,app推广运营的方法(一)

热门文章

  1. 13.相机和图像——缩放和移动是不一样的,移动变焦镜头,镜头并不完美,镜像系统_5
  2. mysql sdi_MySQL 8.0新特性: 数据字典
  3. 如何在服务器运行aspx_ASP.NET开发实战——(四)MVC是如何运行?它的生命周期是什么?...
  4. 2017.8.24 快速傅里叶 思考记录
  5. 2017.4.23 一元三次方程求解 思考记录
  6. bes2300 tws配对_tws 耳机春天来了!
  7. 【英语学习】【WOTD】resurrection 释义/词源/示例
  8. 两空间异面直线公垂线及交点坐标的求解过程
  9. Android解析SVG
  10. mysql数据库 二十一练习题 及答案 (mysql练习题)