用在客户端,SocketChannel注册为
key = sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
..
i = selector.select(60 * 1000);
if(i > 0)
{
Set<SelectionKey> selectionKeys=selector.selectedKeys();
Iterator<SelectionKey> it=selectionKeys.iterator();
while(it.hasNext())
{
SelectionKey k = (SelectionKey)it.next();
if(k.isReadable())
{
//处理响应
pool.execute(new ResponseHandler(sc));
}
if(k.isWritable())
{
pool.execute(new RequestHandler(sc));
}
}
selectionKeys.clear(); 在可写入的时候,从线程池取一个线程来处理。现在发现一个问题,在RequestHandler中写入Buffer的时候,selector并不停止,不久又运行到 if(k.isWritable()) 这一步,又要取一个线程。这样给我造成很大的困惑,难道处理请求就不能使用多线程模式,大家有什么好的经验,请不吝赐教。
key = sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
..
i = selector.select(60 * 1000);
if(i > 0)
{
Set<SelectionKey> selectionKeys=selector.selectedKeys();
Iterator<SelectionKey> it=selectionKeys.iterator();
while(it.hasNext())
{
SelectionKey k = (SelectionKey)it.next();
if(k.isReadable())
{
//处理响应
pool.execute(new ResponseHandler(sc));
}
if(k.isWritable())
{
pool.execute(new RequestHandler(sc));
}
}
selectionKeys.clear(); 在可写入的时候,从线程池取一个线程来处理。现在发现一个问题,在RequestHandler中写入Buffer的时候,selector并不停止,不久又运行到 if(k.isWritable()) 这一步,又要取一个线程。这样给我造成很大的困惑,难道处理请求就不能使用多线程模式,大家有什么好的经验,请不吝赐教。
-------------------------------------------------------------------------------------那在unix或windows下是否也存在此类问题,比如因为socket一直可写而导致select函数一直运行而不阻塞?
记得java在windows是通过 loopback发送信息来唤醒selector。linux通过pipe的event?有待更正。