Java NIO 选择器
来源:互联网 发布:shadowsock mac 知乎 编辑:程序博客网 时间:2024/05/17 01:41
Selector是Java NIO中的一个组件,可以用来检查一个或多个通道,并确定哪一个通道准备好了读或写。通过这种方式,我们可以使用单个线程管理多个通道或多个网络连接。
为什么使用Selector?
使用Selector的优势在于你可以使用单个线程处理多个通道。实际上,你仅使用一个线程就可以处理所有的通道。线程切换对操作系统来说代价是昂贵的,并且每个线程在OS中都要占用一定的资源(内存)。因此,使用的线程越少越好。
请记住,现代操作系统和CPU对多任务的支持越来越好,多线程的时间开销越来越小。实际上,如果一个CPU有多个内核,你并不是因为多任务而浪费了CPU功耗。无论如何,在不同的文章中有不同的观点,这里我们可以说的是,你可以使用Selector来实现单个线程处理多个通道的目的。
下面是使用一个Selector处理3个通道的例子
创建一个Selector
你可以通过调用Selector.open()来创建一个Selector
Selector selector = Selector.open();
注册通道到选择器
为了使用一个Channel和一个Selector,你必须注册通道到Selector我们可以使用SelectableChannel.register()方法,像这样
<div style="text-align: center;"><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">channel.configureBlocking(false);</span></div>SelectionKey key = channel.register(selector, SelectionKey.OP_READ);
通道必须处于非阻塞模式才能使用Selector。这意味对于FileChannel你不能使用Selector,因为FileChannel不能切换到非阻塞模式。SocketChannel不存在这样的问题。
需要注意的是register()的第二个参数,这是“interest set”,是指你对selector在channnel上监听什么类型的事件感兴趣。你可以监听以下四种类型的事件:
Connect
Accept
Read
Write
` A channel that "fires an event" is also said to be "ready" for that event。因此,一个通道成功连接到另外一个服务器就是“connect ready”。一个服务器端Socket接收一个入站连接就是“accept ready”。一个通道有数据可读就是“read ready”,一个通道准备好向其写入数据就是“write ready”。
我们用SelectionKey的四个常量来表示这四个事件:
如果你对多个事件感兴趣,你可以将读个常量放在一起,像这样:
int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;
SelectionKey's
上面的小节我们提到,当我们使用register注册通道到一个Selector上的时候,将会返回一个SelectionKey对象。这个SelectionKey对象,包含一些令人感兴趣的属性:
The interest set
The ready set
The Channel
The Selector
An attached object(options)
下面我们一一讨论这些属性:
Interest Set
The interest set是你感兴趣"selecting"的事件集合。你可以像下面这样通过SelectionKey读写这些interest set:
int interestSet = selectionKey.interestOps();boolean isInterestedInAccept = interestSet & SelectionKey.OP_ACCEPT;boolean isInterestedInConnect = interestSet & SelectionKey.OP_CONNECT;boolean isInterestedInRead = interestSet & SelectionKey.OP_READ;boolean isInterestedInWrite = interestSet & SelectionKey.OP_WRITE;
- JAVA NIO 选择器
- Java NIO 选择器
- JAVA NIO 选择器
- Java nio 之 使用选择器
- Java NIO笔记(八):选择器
- Java nio 之 选择器selector基础
- java nio学习:缓冲区、通道和选择器
- Java NIO系列4:通道和选择器
- java NIO之选择器学习笔记
- Java NIO 5:选择器1---理论篇
- Java NIO 6:选择器2---代码篇
- java nio 实现选择器客户端,服务端
- Java NIO系列4:通道和选择器
- nio-选择器
- nio选择器
- Java NIO 选择器(Selector)与通道(Channel) 原理
- 黑马程序员_O‘Reilly java nio学习笔记之选择器
- Java NIO 选择器(Selector)的内部实现(poll epoll)
- WebView setScrollBarStyle
- Android中asset文件夹和raw文件夹区别
- RedHat下完美安装scrapy爬虫框架
- 什么是 RMS
- sequoiadb 数据库引擎处理查询语句流程
- Java NIO 选择器
- iOS 生成开发者证书,提示无效
- 微信,你的野心到底有多大?
- timezone
- error C2220: warning treated as error - no 'object' file generated
- c++重载<, +, +=, =, ==, <<, >>等符号
- log4j 配置详解
- 豪美红木官网2015/12月总结
- java native&JNI