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

小毛 04-05-17
    

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

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

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

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

    

banq
2004-05-21 09:17

为什么使用阻塞方式啊?

popcorny
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);
}

参考看看