用在客户端,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()) 这一步,又要取一个线程。这样给我造成很大的困惑,难道处理请求就不能使用多线程模式,大家有什么好的经验,请不吝赐教。

解决方案 »

  1.   

    NIO 里面的陷阱多了去了,等待你慢慢地挖掘吧。NIO 最佳实践之一:在有数据写入的时候才去注册 OP_WRITE 事件,写完后及时注销 OP_WRITE 事件。
      

  2.   

    NIO 最佳实践之一:在有数据写入的时候才去注册 OP_WRITE 事件,写完后及时注销 OP_WRITE 事件。
    -------------------------------------------------------------------------------------那在unix或windows下是否也存在此类问题,比如因为socket一直可写而导致select函数一直运行而不阻塞?
      

  3.   

    linux 和 windows 上对于非阻塞的NIO的实现是不同的。
    记得java在windows是通过 loopback发送信息来唤醒selector。linux通过pipe的event?有待更正。