public class MultiReactorNioServer {
private static final ExecutorService exePool = Executors.newFixedThreadPool(4);
public static void main(String[] args) throws Exception{
//定义俩个selector监听器
//一个负责Accept的监听,一个负责客户端channel上的读写事件的监听
Selector acceptSelector = Selector.open();
final Selector ioEventSelector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.bind(new InetSocketAddress("localhost",8585));
server.register(acceptSelector, SelectionKey.OP_ACCEPT);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try{
while (true){
ioEventSelector.select();
Set<SelectionKey> keys = ioEventSelector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//如果是客户端上的读事件
if(key.isReadable()){
exePool.submit(new Runnable() {
@Override
public void run() {
//执行IO读操作
}
});
}
iterator.remove(); //移除处理过的事件
}
}
}catch (Exception e){
e.printStackTrace();
}
}
});
t.start();
while (true){
acceptSelector.select();
//SocketChannel accept = server.accept(); 为什么不需要掉accept
Set<SelectionKey> keys = acceptSelector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while (iterator.hasNext()){
SelectionKey key = iterator.next();
if(key.isAcceptable()){
SocketChannel clientChannel = (SocketChannel) key.channel();
clientChannel.configureBlocking(false);
//使用|或运算符,注册多个事件
clientChannel.register(ioEventSelector,SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
//事件处理完后,要把事件从待处理事件中移出
iterator.remove();
}
}
}
}
Using Multiple Reactors-Demo
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 本文选自2014年的nature communication 摘要:谷氨酸诱导的氧化应激是神经退行性疾病的主要原因...
- 报错如下,意思是:组件模板应该只包含一个根元素。如果在多个元素上使用v-If,请使用v-else-If来链接它们 ...
- 翻译结果:模板语法错误组件模板应该正好包含一个根元素,如果你使用的是v-if多元素,使用v-else-if链他们。...
- https://blogs.ashrithgn.com/multiple-data-source-in-sprin...
- vue模板只能有一个根对象所以你想要出现正常的效果,你的用一个div来或是别的标签来包裹全部的元素,正确的写法就是: