小弟闲来无事, 封装了下nio, 在单线程开发中没遇到问题, 但是在引入了 java 自带的executor 来处理任务时, 碰到了个让小弟楞是蛋疼的问题, 先贴部分代码
while (true) {
if (Status.RUNING.equals(status)) {
count = selector.select();
if (count != 0) {
selectionKeies = selector.selectedKeys().iterator();
while (selectionKeies.hasNext()) {
selectionKey = selectionKeies.next();
selectionKeies.remove();
attachment = selectionKey.attachment();
if (attachment instanceof Runnable) {
//XXX 多线程安全问题, 等待解决
//问题就在这 如,客户端连接当前服务,selector产生了一个Accept selectionKey, 当把这个任务分发给线程池去处理时, 出现了线程 快慢问题, 也就是 线程池还没处理, 当前线程继续了第2次count = selector.select();, 又产生一个Accept selectionKey, 分发给executor处理,这不是我想要的,两个任务处理一个连接,在非阻塞中会出现nullPoinException, 有时候甚至出现 10多次重复的SelectionKey,还麻烦做过nio的 朋友们帮帮忙
executor.execute((Runnable) attachment);
}
}
}
} else if (Status.STOP.equals(status)) {
//睡觉
bed.sleep();
changeStatus(Status.RUNING);
} else {
changeStatus(Status.SHUTDOWN);
break;
}
这段代码存在NioServerBootStart类中小弟项目直接在google svn 开源的。http://shenliuyang.googlecode.com/svn/trunk/ 同事 代码里也实现了数据传输协议哦(CatServerTest), 没有学过nio的可以看看, 改一句代码就可以运行的,在NioServerBootStart有提示
while (true) {
if (Status.RUNING.equals(status)) {
count = selector.select();
if (count != 0) {
selectionKeies = selector.selectedKeys().iterator();
while (selectionKeies.hasNext()) {
selectionKey = selectionKeies.next();
selectionKeies.remove();
attachment = selectionKey.attachment();
if (attachment instanceof Runnable) {
//XXX 多线程安全问题, 等待解决
//问题就在这 如,客户端连接当前服务,selector产生了一个Accept selectionKey, 当把这个任务分发给线程池去处理时, 出现了线程 快慢问题, 也就是 线程池还没处理, 当前线程继续了第2次count = selector.select();, 又产生一个Accept selectionKey, 分发给executor处理,这不是我想要的,两个任务处理一个连接,在非阻塞中会出现nullPoinException, 有时候甚至出现 10多次重复的SelectionKey,还麻烦做过nio的 朋友们帮帮忙
executor.execute((Runnable) attachment);
}
}
}
} else if (Status.STOP.equals(status)) {
//睡觉
bed.sleep();
changeStatus(Status.RUNING);
} else {
changeStatus(Status.SHUTDOWN);
break;
}
这段代码存在NioServerBootStart类中小弟项目直接在google svn 开源的。http://shenliuyang.googlecode.com/svn/trunk/ 同事 代码里也实现了数据传输协议哦(CatServerTest), 没有学过nio的可以看看, 改一句代码就可以运行的,在NioServerBootStart有提示
解决方案 »
- 请帮看一个字符串相似度分析的bug
- java socket编程 - 服务端和客户端两边端口号居然不相等?!
- 300分!给一个数组 求里面出现次数最多的元素和其次数 另:需要加上时间复杂度,否则只给5分。最优算法给100分
- 有一个比较钻牛角尖的问题,关于当前时间的取得
- 求救:java程序调用sh脚本没有反应,我错在哪里?
- 关于keyEvent
- JNI新手求助,创建不了新的jdouble数组
- drawString时怎样规定一个区域,在这个区域内的文字显示,超出的不显示
- c# 即降支持跨平台, Java 如何应对???
- 简单问题2
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space,怎么办
- 一个字符串处理的小问题,给点思路。
ServerSocketChannel server = (ServerSocketChannel) key.channel();
SocketChannel channel = server.accept();
去接收这个请求再往下处理,即已经接收这个请求了,这样,就不会产生第二次accept请求了
这样是肯定不行的哦, 所有的请求肯定是要任务线程去处理的, 不光接收,客户端还要发数据呢, 我现在想到了一个办法, 那就是拿到SelectionKey的时候把他注册的时间给remove掉, 在把任务分给任务池处理, 在在各个任务中处理完数据后, 在加上相应的事件, 这样估计就没问题了,不 过还没试过, 好累、、、公司搞活动刚回来, 看到你们的回答, 太感谢你们啦