分享

java nio之select()问题 Java / J2SE / 基础类

 达能牛牛 2007-03-12

近阶段在学习java   nio的问题,对其中的Selector类,对select()方法等一直问题多多,现有以下疑问,期待各位高手的不吝赐教。  
        1、一个Selector()最多可以注册多少个Channels呢,听同事说,unix   c里面的这个是可以配置的,默认为64个。请问,java是否也有这样的一个数量大小的配置?  
        2、当一个socketchannel是可以read的时候,立即把里面的数据读出来,可是我要不关闭连接和流的话,socketchannel.read(ByteBuffer)就一直返回0,还是占用了一个线程,请问,我是否可以在读完流里面的数据后,取消掉read的注册?然后再重新注册这个socketchannel?  
        3、请问哪位有用java   nio做服务端的实例?可以支持大并发量的那种?非常感谢!   

1)   Java自动管理,与unix下不太一样。我建议你作个试验,看看能支持多少个channel。我采用windows平台,底层的api不一样,windows异步通讯没有这个限制(采用CompeletionPort)。如果只有64个限制,请设计一个数据请求线程池,很容易吧?  
  2)很奇怪,当channel可以读时,你需要直接读取(利用线程池读写数据),读完缓冲区,需要设计报文识别器,看看是否完整报文等等操作。然后继续等待读取。不需要取消的,但需要继续注册。  
  //   Resume   interest   in   OP_READ  
  key.interestOps(key.interestOps()   |   SelectionKey.OP_READ);  
  //   Cycle   the   selector   so   this   key   is   active   again  
  key.selector().wakeup();  
  3)我做过一个异步通讯服务器,支持协议可配置可自动识别等。对于通讯部分,已经完成,在考虑能够支持JMS等方面功能。这个不是例子,不能公开。  
  我的msn:   hbao2k@hotmail.com,菜鸟就不要来烦我了哦  
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多