【原创】java NIO selector 学习笔记 一
能力有限,仅仅是自己看源码的一些笔记。
主要介绍 可选通道 和 选择器 选择键(SelectableChannel 和 Selector SelectionKey)
选择器(Selector) 选择器类管理着一个被注册的通道集合的信息和它们的就绪状态。通道是和选择器一起被注册的,并且使用选择器来更新通道的就绪状态。当这么做的时候,可以选择将被激发的线程挂起,直到有就绪的的通道。
可选通道 selectableChannel可以被注册到Selector对象上,一个通道可以被注册到多个选择器上,但是对于每个选择器而言只能被注册一次。而且只有继承了selectableChannel的类才能被注册到通道上,并且注册的Channel需要是非阻塞的。
选择键 选择键封装了特定的通道与特定的选择器的注册关系。
接下来结合socketChannel的代码一一介绍:
  serverSocketChannel = ServerSocketChannel.open();
		  serverSocketChannel.socket().bind(new InetSocketAddress(port));
		  serverSocketChannel.configureBlocking(false);
selector = Selector.open();
while(true)
			{
				SocketChannel socketchannel =serverSocketChannel.accept();
				if(socketchannel!=null)
				{
					System.out.println("收到连接");
					socketchannel.configureBlocking(false);
					socketchannel.register(selector, SelectionKey.OP_READ);
}
				int num=selector.selectNow();
				if(num>0)
				{
					Set selectedKeys = selector.selectedKeys();
					Iterator keyItertor=selectedKeys.iterator();
					while(keyItertor.hasNext())
					{
						SelectionKey key = (SelectionKey) keyItertor.next();
						if(key.isReadable())
						{
							socketchannel = (SocketChannel) key.channel();
System.out.println(new String(buffer.array(),"utf-8"));
							buffer.clear();
							break;
						}
					}
				}
			}
首先获取一个Selector。获取selector只能使用Open方法。接下来我想说的是注册 register方法
Channel的register的源码 来自AbstractSelectableChannel
public final SelectionKey register(Selector sel, int ops,
                                       Object att)
        throws ClosedChannelException
    {
        if (!isOpen())
            throw new ClosedChannelException();
        if ((ops & ~validOps()) != 0)
            throw new IllegalArgumentException();
        synchronized (regLock) {
            if (blocking)
                throw new IllegalBlockingModeException();
            SelectionKey k = findKey(sel);
            if (k != null) {
                k.interestOps(ops);
                k.attach(att);
            }
            if (k == null) {
                // New registration
                k = ((AbstractSelector)sel).register(this, ops, att);
                addKey(k);
            }
            return k;
        }
    }
当这个Channel已经在通道上注册了的话则更新 ops和att,否则调用AbstractSelector的register方法来注册。注意 Selector本身并没有register方法。
然后再看SelectorImp中的实现:
protected final SelectionKey register(AbstractSelectableChannel ch,
                                          int ops,
                                          Object attachment)
    {
        if (!(ch instanceof SelChImpl))
            throw new IllegalSelectorException();
        SelectionKeyImpl k = new SelectionKeyImpl((SelChImpl)ch, this);
        k.attach(attachment);
        synchronized (publicKeys) {
            implRegister(k);
        }
        k.interestOps(ops);
        return k;
    }
implRegister()的实现没找到。对于SPI不了解呀。
接下来介绍SelectionKey
介绍SelectionKeyImp
成员:
final SelChImpl channel; // package-private
    final SelectorImpl selector;                        // package-private
// Index for a pollfd array in Selector that this key is registered with
    private int index;
private volatile int interestOps;
    private int readyOps;
和注册相关的方法:
public SelectionKey interestOps(int ops) {
        ensureValid();
        return nioInterestOps(ops);
    }
SelectionKey nioInterestOps(int ops) { // package-private
        if ((ops & ~channel().validOps()) != 0)
            throw new IllegalArgumentException();
        channel.translateAndSetInterestOps(ops, this);
        interestOps = ops;
        return this;
    }
这一篇就到这吧。
【原创】java NIO selector 学习笔记 一的更多相关文章
- Java NIO 完全学习笔记(转)
		本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ... 
- 【原创】java NIO FileChannel 学习笔记 FileChannel 简介
		java NIO 中FileChannel 的实现类是 FileChannelImpl,FileChannel本身是一个抽象类. 先介绍FileChannel File Channels 是线程安全 ... 
- Java NIO 核心组件学习笔记
		背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ... 
- 【原创】java NIO FileChannel 学习笔记 FileChannel实现分析 即FileChannelImpl分析
		上文已经说了FileChannel是一个抽象类,FileChannelImpl是其实现,接下来介绍FileChannelImpl,参考代码来自OpenJDK7 首先 public class File ... 
- 【原创】java NIO FileChannel 学习笔记 新建一个FileChannel
		首先使用FileChannel 的open方法获取一个FileChannel对象.下面这段代码是FileChannel中open方法的代码. public static FileChannel ope ... 
- Java NIO 缓冲区学习笔记
		Buffer其实就是是一个容器对象,它包含一些要写入或者刚读出的数据.在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别.在面向流的I/O中,您将数据直接写入或者将数据直接读到Stre ... 
- NIO模型学习笔记
		NIO模型学习笔记 简介 Non-blocking I/O 或New I/O 自JDK1.4开始使用 应用场景:高并发网络服务器支持 概念理解 模型:对事物共性的抽象 编程模型:对编程共性的抽象 BI ... 
- JAVA GUI编程学习笔记目录
		2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ... 
- Java多线程技术学习笔记(二)
		目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ... 
随机推荐
- HDU1864--01背包
			最大报销额 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ... 
- POJ 3061 Subsequence 尺取法 POJ 3320 Jessica's Reading Problem map+set+尺取法
			Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13955 Accepted: 5896 Desc ... 
- ThinkPHP的Rbac权限控制
			RBAC(Role-Based Access Controll)基于角色的访问控制 在 ThinkPHP3.2.3 中 RBAC 类位于 /ThinkPHP/Library/Org/Util/Rbac ... 
- TempFile模块
			tempfile模块,用来对临时数据进行操作 tempfile 临时文件(夹)操作 tempfile.mkstemp([suffix="[, prefix='tmp'[, dir=None[ ... 
- 迭代加深搜索POJ 3134 Power Calculus
			题意:输入正整数n(1<=n<=1000),问最少需要几次乘除法可以从x得到x的n次方,计算过程中x的指数要求是正的. 题解:这道题,他的结果是由1经过n次加减得到的,所以最先想到的就是暴 ... 
- Android官方技术文档翻译——Gradle 插件用户指南(5)
			昨晚把第五章未译完的几句话攻克了.只是第六章没怎么译,明后天又是周末,假设周一前第六章翻译完的话,周一再发第六章. 本文译自Android官方技术文档<Gradle Plugin User Gu ... 
- STM32W108无线射频模块通用IO接口应用实例
			STM32W108无线射频模块通用IO接口应用实例 本实例编写STM32W108的GPIO測试程序,通过控制GPIO引脚,实现对LED灯的控制. 开发环境与硬件说明 硬件:STM32W108无线开发板 ... 
- 入门vue----(vue的安装)
			1.安装node.js 2.基于node.js,利用淘宝npm镜像安装相关依赖 在cmd里直接输入:npm install -g cnpm –registry=https://registry.npm ... 
- Shell编程中的变量作用域
			有两个shell脚本文件: a.sh name=Tom echo $name ./b.sh b.sh echo "name in b.sh:"$name 运行./a.sh时输出结果 ... 
- 项目实战12.2—企业级监控工具应用实战-zabbix操作进阶
			无监控,不运维.好了,废话不多说,下面都是干货. 流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html 一.U ... 
