记几个要点:
一、思想
1、分离接收请求与执行请求
a、由一个线程池通过阻塞方式接收网络连接请求
b、由一个线程池通过非阻塞去执行任务队列中的具体任务
二、知识点
1、Selector是多线程安全的,但是容易进入死锁,如
a、selector.slect();
b、channel.register(selector,SelectionKey.OP_READ);
这两个方法都会请求selector的锁,致使阻塞线程
2、同一个Channel向一个Selector注册多次,事件不会叠加,而是替换。因此在处理读写时应注意
3、关于数据读写与ByteBuffer
a、当数据读取完毕时,ByteBuffer的flip()方法用于锁定缓冲区
b、在写数据时,由ByteBuffer的hasRemaining()方法检测是否写完
4、当完成输入输出时,应先调用下述方法再关闭Channel,即
a、channel.socket().shutdownInput();
b、channel.socket().shutdownOutput();
c、channel.close();
5、当处理就绪的事件时,应不要忘记删除该key,即
a、Iterator<SelectionKey> it = keys.iterator();取出key后it.remove();
b、在处理完该SelectionKey后,如果不再需要,必须调用key.canel();
否则在下一次循环中将重复该key。当然也可以重新注册事件,原先的感兴趣Ops将给覆盖
三、其他
a、windows平台上默认的Socket端口不是很多,在做高并发压力测试时客户端经常出现的错误为端口绑定失败
Java非阻塞(NIO)编写高并发网络程序
最新推荐文章于 2025-09-07 20:08:22 发布
