概述

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

热门文章

  1. 大数据学习笔记:初探大数据世界
  2. Java讲课笔记08:数组
  3. 二级VB培训笔记05:文件操作
  4. hypermesh安装包百度云_新闻突然!全新百度网盘发布
  5. 2017.4.26 组合数问题 思考记录
  6. 【JAVA核心知识】6.1: JAVA IO基础
  7. Android JNI开发入门之二
  8. Java 反射 mdc失效,log4j中MDC使用陷阱
  9. wow修改人物模型_玻璃钢气球狗模型景观雕-东莞气球树脂雕塑
  10. opencv python 多帧降噪算法_实战 | OpenCV实现视频防抖