请教一个JAVA NIO的问题,急急!!

coolcpz 2014-06-10 12:59:36
public void register(Socket_Handle_Intf handle, int event) throws IOException {
try {
SelectionKey key = handle.get_channel().keyFor(socket_selector);
if (null == key) {
key = handle.get_channel().register(socket_selector, event);
if (null != key) {
key.attach(handle);
System.out.println("end to attach network event\n");
}
}
else {
key.interestOps(event);
}

} catch (ClosedChannelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

在进行事件注册时调用key = handle.get_channel().register(socket_selector, event);后一直没有返回。请各位大侠帮帮忙指点下是什么问题,小弟感激不尽…………
...全文
136 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolcpz 2014-06-16
  • 打赏
  • 举报
回复
感觉像是select的时候进行register会阻塞,直到select返回,但是奇怪的是我select是有超时返回的,还是会出现很长时间阻塞在register函数,后来通过判断select的返回值,如果是没有事件则延时500毫秒,问题解决,但这样对于网络事件处理的性能影响很大,但没办法了,想不到是什么原因导致,只能够这样先解决了。
coolcpz 2014-06-10
  • 打赏
  • 举报
回复
在注册事件的时候其它地方没有执行register操作,只是开了一个线程进行SELECT ----------------------------------------------- connection.connect(remote_addr); msg_processer = processer; if (connection.isConnected()) { connection.configureBlocking(false); poller.register(this, Socket_Event_Poller.Socket_Event_Read); return SMS_ErrorCode.SMS_ERR_SUCCESS; } ------------------------------------------------- public void run() { // TODO Auto-generated method stub try { while (true){ int retVal = socket_selector.select(3); if (retVal > 0) { Iterator it = socket_selector.selectedKeys().iterator(); while (it.hasNext()){ SelectionKey sk = (SelectionKey) it.next(); it.remove(); Socket_Handle_Intf intf = (Socket_Handle_Intf) sk.attachment(); if (null == intf) { continue; } if (!sk.isValid() || (sk.interestOps() == 0)) { continue; } if (sk.isReadable()) { System.out.println("Socket OnRecive()\n"); intf.on_receive(); } else if (sk.isConnectable()) { intf.on_connect(); } else if (sk.isWritable()) { System.out.println("Socket OnWrite()\n"); intf.on_write(); } else if (sk.isAcceptable()) { intf.on_accept(); } } } else if (retVal < 0) { break; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } -----------------------------------------------------
xlight2023 2014-06-10
  • 打赏
  • 举报
回复
API原文: This method may be invoked at any time. If this method is invoked while another invocation of this method or of the configureBlocking method is in progress then it will first block until the other operation is complete. This method will then synchronize on the selector's key set and therefore may block if invoked concurrently with another registration or selection operation involving the same selector.

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧