`
xuyongping
  • 浏览: 123563 次
  • 性别: Icon_minigender_1
  • 来自: 部落格
社区版块
存档分类
最新评论

反射器模式

 
阅读更多
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。

Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。

如果你至今还是在怀疑Java的性能,说明你的思想和观念已经完全落伍了,Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持,Java应用在游戏等适时领域方面的机会已经成熟,Java在稳定自己中间件地位后,开始蚕食传统C的领域。

本文主要简单介绍NIO的基本原理,在下一篇文章中,将结合Reactor模式和著名线程大师Doug Lea的一篇文章深入讨论。

NIO主要原理和适用。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

了解了这个基本原理,我们结合代码看看使用,在使用上,也在分两个方向,一个是线程处理,一个是用非线程,后者比较简单,看下面代码:


import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.channels.spi.*;
import java.net.*;
import java.util.*;
/**
*
* @author Administrator
* @version
*/



public class NBTest {


  /** Creates new NBTest */
  public NBTest()
  {
  }

  public void startServer() throws Exception
  {
  int channels = 0;
  int nKeys = 0;
  int currentSelector = 0;

  //使用Selector
  Selector selector = Selector.open();

  //建立Channel 并绑定到9000端口
  ServerSocketChannel ssc = ServerSocketChannel.open();
  InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),9000);
  ssc.socket().bind(address);

  //使设定non-blocking的方式。
  ssc.configureBlocking(false);

  //向Selector注册Channel及我们有兴趣的事件
  SelectionKey s = ssc.register(selector, SelectionKey.OP_ACCEPT);
  printKeyInfo(s);

  while(true) //不断的轮询
  {
    debug("NBTest: Starting select");

    //Selector通过select方法通知我们我们感兴趣的事件发生了。
    nKeys = selector.select();
    //如果有我们注册的事情发生了,它的传回值就会大于0
    if(nKeys > 0)
    {
      debug("NBTest: Number of keys after select operation: " +nKeys);

      //Selector传回一组SelectionKeys
      //我们从这些key中的channel()方法中取得我们刚刚注册的channel。
      Set selectedKeys = selector.selectedKeys();
      Iterator i = selectedKeys.iterator();
      while(i.hasNext())
      {
         s = (SelectionKey) i.next();
         printKeyInfo(s);
         debug("NBTest: Nr Keys in selector: " +selector.keys().size());

         //一个key被处理完成后,就都被从就绪关键字(ready keys)列表中除去
         i.remove();
         if(s.isAcceptable())
         {
           // 从channel()中取得我们刚刚注册的channel。
           Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
           SocketChannel sc = socket.getChannel();

           sc.configureBlocking(false);
           sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
                      System.out.println(++channels);
         }
         else
         {
           debug("NBTest: Channel not acceptable");
         }
      }
   }
   else
   {
      debug("NBTest: Select finished without any keys.");
   }

  }

}


private static void debug(String s)
{
  System.out.println(s);
}


private static void printKeyInfo(SelectionKey sk)
{
  String s = new String();

  s = "Att: " + (sk.attachment() == null ? "no" : "yes");
  s += ", Read: " + sk.isReadable();
  s += ", Acpt: " + sk.isAcceptable();
  s += ", Cnct: " + sk.isConnectable();
  s += ", Wrt: " + sk.isWritable();
  s += ", Valid: " + sk.isValid();
  s += ", Ops: " + sk.interestOps();
  debug(s);
}


/**
* @param args the command line arguments
*/
public static void main (String args[])
{
  NBTest nbTest = new NBTest();
  try
  {
    nbTest.startServer();
  }
    catch(Exception e)
  {
    e.printStackTrace();
  }
}

}

这是一个守候在端口9000的noblock server例子,如果我们编制一个客户端程序,就可以对它进行互动操作,或者使用telnet 主机名 90000 可以链接上。

通过仔细阅读这个例程,相信你已经大致了解NIO的原理和使用方法,下一篇,我们将使用多线程来处理这些数据,再搭建一个自己的Reactor模式。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    论文研究-Influence of Corrugation Parameters on Mode Selectivity in a Coaxial Bragg Reflector.pdf

    论文《波纹参数对同轴布拉格反射器模式选择的影响》由卢莺和赖颖昕撰写,提出了研究同轴布拉格反射器内外导体开正弦波纹后对模式选择性的影响,并通过耦合模理论分析在不同的波纹参数条件下,通过数值分析研究了波纹...

    2024年中国三面角反射器发展创新模式与重点企业研究报告.pptx

    总结2024年中国三面角反射器发展创新模式与重点企业研究报告揭示了行业的发展现状、创新模式以及未来趋势。在科技创新、业务创新和组织创新的驱动下,中国三面角反射器市场有望实现持续增长。同时,企业需要面对市场...

    专题资料(2021-2022年)《机动车辆产品强制性认证实施规则》机动车回复反射器产品.doc

    - 认证委托和受理:制造商需向认证机构提交申请,认证单元的划分基于反射器级别和光学单元的差异。 - 型式试验:送样原则是根据产品型号和认证单元,样品数量至少为10个,若有不同颜色还需额外提供2个样本。完成后...

    抽象工厂模式+反射技术(抽象工厂模式+简单工厂模式)

    在Java或其他面向对象的语言中,反射是一种强大的工具,它允许程序在运行时检查类的信息,包括类的方法、属性和构造器,甚至可以在运行时动态创建对象并调用其方法。当结合抽象工厂模式使用时,反射可以用来动态地...

    卫星角反射器精度对远场衍射模式的影响

    针对圆形切割的角反射器, 仿真计算了不同光束入射角及方位角、角反射器二面角和面形误差所对应的远场衍射模式, 并详细分析了它们对远场衍射模式的影响规律。仿真结果表明, 随着二面角误差、面形误差和光束入射角的...

    利用java反射原理实现工厂模式

    这时,我们可以结合Java的反射机制来优化工厂模式,使其具备更高的动态性。 Java反射机制是Java语言提供的一种强大的工具,允许程序在运行时检查类、接口、字段和方法的信息,并能动态地调用方法或访问和修改字段值...

    基于matlab的抛物面反射器的孔径效率.zip

    抛物面反射器在通信、雷达、天文学等领域有着广泛的应用,其主要功能是将入射的电磁波聚焦到一个特定的焦点上,从而提高信号的接收或发射效率。孔径效率是衡量抛物面反射器性能的重要指标,它描述了抛物面反射器能够...

    基于Matlab模拟抛物线反射器辐射图.zip

    这些函数可能包含了计算抛物面反射器几何参数、辐射模式或者天线增益的算法。 1.PNG 文件很可能是模拟结果的可视化图像,展示抛物面反射器的辐射图。辐射图通常表示天线在不同方向上的辐射强度,它可以帮助我们理解...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    行业文档-设计装置-在照明装置中带有可调整的反射表面的反射器组件.zip

    在照明装置设计中,反射器组件扮演着至关重要的角色,其功能是有效地引导和集中光源,从而提高照明效率和质量。这份"行业文档-设计装置-在照明装置中带有可调整的反射表面的反射器组件.zip"包含了关于这一专业领域的...

    复合材料卫星反射器机器人喷涂过程分析及工艺参数研究.pdf

    随着现代科技的发展,尤其在航空航天领域,对于卫星天线反射器的要求越来越高,这些反射器主要用于通信卫星中将信号反射到地面接收装置。本文介绍了如何通过机器人技术对复合材料卫星反射器进行金属化处理,以提高其...

    激光测距用角反射器的设计

    这种衍射模式取决于角反射器内部的几何结构及其材料特性。 - **光斑强度分布**:通过分析反射光斑中的强度分布,可以更准确地评估角反射器对激光测距能力的影响。 **2. 设计因素** - **两面角误差**:当角反射器的...

    java 反射技术 设计模式 spring security 安全管理手册

    在Java中,常见的设计模式包括工厂模式、单例模式、装饰器模式、代理模式、观察者模式等。例如,工厂模式提供了一种创建对象的最佳方式,而单例模式确保一个类只有一个实例。设计模式的应用能够提高代码的可读性、可...

    单片集成微环反射器可调谐半导体环形激光器理论和数值模型(英文).pdf

    标题和描述中提到的是一种基于单片集成微环反射器的可调谐半导体环形激光器,这是一种新型的激光器设计,旨在实现快速且稳定的频率调谐。文章出自《强激光与粒子束》杂志的第24卷第2期,2012年2月刊。该研究由中国...

    策略模式+反射+MVC4

    在结合策略模式和反射的MVC4应用中,我们可以在控制器中利用反射来动态选择并实例化策略类,根据业务需求来执行相应的算法。例如,在一个购物网站的折扣计算场景中,控制器可以根据用户的会员等级或促销活动,通过...

    机动车回复反射器产品强制性认证实施规则.doc

    该文件是中国国家认证认可监督管理委员会发布的关于“机动车回复反射器产品强制性认证实施规则”的详细规定,编号为CNCA—02C—056:2005。这份规则于2005年10月10日发布,并于2005年12月1日开始实施,旨在确保机动...

    IoC容器的设计(利用反射、注解和工厂模式实现)

    1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义如下: 注解 含义 @Component 标注Bean @Autowired 标注需要被注入的...

    波长和模式间隔可调双模分布式布拉格反射器激光器

    在这份研究论文中,讨论了波长和模式间隔可调的双模分布式布拉格反射器(DBR)激光器。分布式布拉格反射器激光器是一种利用在半导体介质中形成的光栅结构实现反馈的激光器,可以产生特定波长的激光。本论文介绍了一...

    电子政务-具有碗状物和反射器的电烹饪设备.zip

    在"具有碗状物和反射器的电烹饪设备"这一主题中,我们可能在讨论的是现代厨房电器中的一个创新设计。这种设备结合了碗状物和反射器,可能是一种高效能的电饭煲、电磁炉或电烤箱。碗状物的设计通常是为了更好地分布...

Global site tag (gtag.js) - Google Analytics