易截截图软件、单文件、免安装、纯绿色、仅160KB

Java NIO类库Selector机制解析(下)

 
Java NIO类库Selector机制解析(下)
 
赵锟   陈皓
http://blog.csdn.net/haoel
 
<<<<点此查看本文上篇
五、  迷惑不解 : 为什么要自己消耗资源?
 
令人不解的是为什么我们的Java的New I/O要设计成这个样子?如果说老的I/O不能多路复用,如下图所示,要开N多的线程去挨个侦听每一个Channel (文件描述符) ,如果这样做很费资源,且效率不高的话。那为什么在新的I/O机制依然需要自己连接自己,而且,还是重复连接,消耗双倍的资源?
 
通过WEB搜索引擎没有找到为什么。只看到N多的人在报BUG,但SUN却没有任何解释。
 
下面一个图展示了,老的IO和新IO的在网络编程方面的差别。看起来NIO的确很好很强大。但似乎比起C/C++来说,Java的这种实现会有一些不必要的开销。
 
 
 
六、  它山之石 : 从Apache的Mina框架了解Selector
 
上面的调查没过多长时间,正好同学赵锟的一个同事也在开发网络程序,这位仁兄使用了Apache的Mina框架。当我们把Mina框架的源码研读了一下后。发现在Mina中有这么一个机制:
 
1)Mina框架会创建一个Work对象的线程。
2)Work对象的线程的run()方法会从一个队列中拿出一堆Channel,然后使用Selector.select()方法来侦听是否有数据可以读/写。
3)最关键的是,在select的时候,如果队列有新的Channel加入,那么,Selector.select()会被唤醒,然后重新select最新的Channel集合。
4)要唤醒select方法,只需要调用Selector的wakeup()方法。
 
对于熟悉于系统调用的C/C++程序员来说,一个阻塞在select上的线程有以下三种方式可以被唤醒:
1)  有数据可读/写,或出现异常。
2)  阻塞时间到,即time out。
3)  收到一个non-block的信号。可由kill或pthread_kill发出。
所以,Selector.wakeup()要唤醒阻塞的select,那么也只能通过这三种方法,其中:
 
1)第二种方法可以排除,因为select一旦阻塞,应无法修改其time out时间。
2)而第三种看来只能在Linux上实现,Windows上没有这种信号通知的机制。
 
所以,看来只有第一种方法了。再回想到为什么每个Selector.open(),在Windows会建立一对自己和自己的loopback的TCP连接;在Linux上会开一对pipe(pipe在Linux下一般都是成对打开),估计我们能够猜得出来——那就是如果想要唤醒select,只需要朝着自己的这个lo


相关文档:

java正则表达式中的数量词

    java中的正则位于java.util.regex包中,这个包中只有一个MatchResult接口和Matcher、Pattern两个类。
   正则中的数量词有Greedy (贪婪)、Reluctant(懒惰)和Possessive(强占)三种
  
 Greedy 数量词
X?
X,一次或一次也没有
X*
X,零次或多次
X+
X,一次或多次
X{n ......

JAVA冒泡排序算法的几种实现方法

本文出自 “唐大老师” 博客,请务必保留此出处http://tscjsj.blog.51cto.com/412451/84561
public class Bubble {
// 冒泡排序函数1
public static void bubbleSort1(Comparable []data){

int position,scan;
Comparable temp;
for(position = data.length-1;position>=0;position--){
......

Java 字符集编码

首先看清楚几种常用的字符集编码(java语言是采用unicode字符集编码来表示字符与字符串的):
  ASCII(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进 ......

Java和.NET继续争斗的四大相关问题

【51CTO精选译文】在本篇文章中,著名程序员Justin James讨论了Java的未来,以及Java与.NET的开发成本对比,和Java是否能够取代.NET。Justin在文中总结了四大要点,重点关注了两个运行时在性能和成本上的异同之处。
1、Java SE 7遭遇.NET CLR会发生什么?
从Java SE 7的功能列表中可以看出,它相比以前版本有了长足提高。 ......

Java NIO类库Selector机制解析(上)

 
Java NIO类库Selector机制解析(上)
 
赵锟   陈皓
http://blog.csdn.net/haoel
 
一、  前言
 
自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但引入了全新的高效的I/O机制,同时,也引入了多路复用的异步模式。NIO的包中主要包含了这样几种抽象数据类型:
  ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号