发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

关于Java NIO的一些问题,求助。

    
2004-05-17 15:31
赞助商链接

在一写一个多用户的Server程序。
现在的问题是在selector.select()方法上。
如果调用select()方法,阻塞方式等待事件,这个时候就不可以再在这个selector上注册新的事件,我感觉是互相锁了。
如果调用select(100)这样的非阻塞方式,可以避开这个问题,但是影响性能,因为有很多空转。

我尝试着使用wakeup让select()方法释放对selector的锁定,可是因为在while循环里面执行得太快,下一个循环到来时候新的事件还没有来得及注册上结果又锁上了。

目前使用的方法是在wakeup之后让while循环sleep 10毫秒,虽然能解决这个问题,但是毕竟感觉不爽,又没有高人能解决的。

简单的说就是一个线程被select()方法挂起,另一个线程如果尝试在这个selector上注册事件则也会被挂起。

2004-05-21 09:17

为什么使用阻塞方式啊?

2004-05-25 16:36

建议register跟interestOps这两个method都透过selector的线程做处理
而若是multi-thread程式
可以用producer-consumer pattern来委selector thread做注册
若还要取得SelectionKey..
可以使用Future pattern
方法如下

Thread A:

queue.enqueue(new RegisterTask(channel, ops));
selector.wakeup();


Thread Selector:

RegisterTask task;
seletor.select();
while((task = queue.dequeue()) != null){
task.channel.register(selector, task.ops);
}

参考看看

nio     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系反馈 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com