Selector选择器Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以 Selector选择器 Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以做别的事情当有事件发生的时
Selector选择器
Selector工作流程我们把想要的soketchannel告诉selector后我们就去可以做别的事情当有事件发生的时候selector会通知我们然后获取selectionkey获得我们感兴趣的事件。
selecotr是java nio多路复用的关键类selector实现了一个线程管理多个channel只需要更少的资源来处理更多的通道节省线程之间的开销这么说seletor是以前cpu很贵的时候现在很多公司的机器都是多核充分利用cpu才是最好的应用后期会写些JAVA NIO的最佳实践netty。
下面写几个简单的例子
Seletor的创建方式
1 Selector selector Selector.open();channel注册到seletor上
1 SelectionKey key channel.register(selector,Selectionkey.OP_READ);channel注册到Selector后会返回一个SelectionKey对象SelectionKey代表着这个channel和注册的
selector的关系SelectionKey维护着两个重要的属性interestOps和readyops。
Selector通常会监听四种类型的事件
-
connect
-
accept
-
read
-
write
这四种事件通常用Selectionkey对应的一些
-
SelectionKey.OP_CONNECT
-
SelectionKey.OP_ACCEPT
-
SELECTIONKEY.OP_READ
-
SELECTIONKEY.OP_WRITE
select()方法
1 2 3 int selectCount selector.select();阻塞到至少有一个再注册的通道上就绪了 selector.select(timeout);这个有超时时间 selector.selectNow();这个是到无论有没有都立马就返回了selectedKeys()方法
1 2 3 Set keys selector.selectedKeys(); //获取迭代器 Iterator keyIterator keys.iterator();获取我我们需要的监听的事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 while (keyIterator.hasNext()) { SelectionKey key keyIterator.next(); if (!key.isValid()) { continue; } if (key.isAcceptable()) { ServerSocketChannel sscTemp (ServerSocketChannel) key.channel(); //得到一个连接好的SocketChannel并把它注册到Selector上兴趣操作为READ SocketChannel socketChannel sscTemp.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); System.out.println("REGISTER CHANNEL , CHANNEL NUMBER IS:" selector.keys().size()); } else if (key.isReadable()) { //读取通道中的数据 SocketChannel channel (SocketChannel) key.channel(); read(channel); } keyIterator.remove(); //该事件已经处理可以丢弃 JAVA NIO Selector 知识三 http://shangdc.blog.51cto.com/10093778/1956602 JAVA NIO buffer 知识三 http://shangdc.blog.51cto.com/10093778/1956602 JAVA NIO 之 channel通道知识二 http://shangdc.blog.51cto.com/10093778/1955874 JAVA NIO 知识一 http://shangdc.blog.51cto.com/10093778/1955793 本文转自 豆芽菜橙 51CTO博客原文链接:http://blog.51cto.com/shangdc/1956921