java nio基础使用示例

 更新时间:2013年11月19日 14:12:16   作者:  
传统的io技术为阻塞的,java新nio是非阻塞的,注册一个op_read事件,注册到selector对象上,当有数据到来时候,selector回通知之前注册事件的对象,进行read处理,看面我看看它是如何使用的

在jdk1.4中提出的技术,非阻塞IO,采用的是基于事件处理方式。
传统的io技术为阻塞的,比如读一个文件,惹read方法是阻塞的,直到有数据读入。
归纳为:
1、java io为阻塞,在打开一个io通道后,read将一直等待在端口一边读取字节内容,如果没有内容进来,read相当于阻塞掉了。
2、在1的基础上改进为,开设线程,serversocker.accept()后让线程去等待,但是当并发量高的时候,相当耗费资源的。
3、java nio为非阻塞,采用的是reactor反应堆模式,或者说observer观察者模式,监察io端口,注册事件到selector,当事件满足条件后触发行为。
大致流程为:
java nio提供一个selector,这个类似一个观察者,将需要探知的socketchannel注册到selector上
接着我们做别的事情,当有事件发生时候,selector会通知我们,传回一组selectionKey,我们读取这些key就会获得到我们刚刚注册过的socketchannel,然后从这个channel读取数据、处理业务逻辑。
selector内部原理,采用轮询的方式,对所注册的channel进行遍历,判断channel所注册的事件是否发生。
代码举例为:

复制代码 代码如下:

// 1.创建一个selector对象
Selector selector = Selector.open();
// 2.建立channel对象,并绑定在8080端口上
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(),8080);
ssc.socket().bind(address);
// 3.将channel设定为非阻塞方式
ssc.configureBlocking(false);
// 向selector注册channel以及我们感兴趣的事件
SelectionKey skey = ssc.register(selector,SelectionKey.OP_ACCEPT);// 这边注册了accept,服务器接受到client连接事件
// 4、简单模拟下轮询过程
while(true)
{
  // selector通过select方法,通知我们感兴趣的事件发生了
  int nKeys = selector.select();
  // 当nKeys>0表示事件发生了
  // 这时候可以通过selector.selectedKeys();方法拿到key集合
  Set selectKeys = selector.selectedKeys();
  // 5、迭代遍历keys对象,分别做适配业务逻辑处理
  // 比如:
  s = (SelectionKey)(selectKeys.iterator()).next();
  if(s.isAcceptable())// 判断为注册的OP_ACCEPT事件
  {
    // 从channel中获取我们刚才注册的channel
    Socket socket = ((ServerSocketChannel)s.channel()).accept().socket();
    SocketChannel sc = socket.getChannel();
    // 设置为非阻塞
    sc.configureBlocking(false);
  // 注册read/write事件
    sc.register(selector, SelectionKey.OP_READ |SelectionKey.OP_WRITE);
  }
}
// 上边就是简单的java nio演示的伪代码
// 这时候,client端可以telnet 主机名 端口号 连接到server服务器。

相关文章

  • 如何在Spring Boot中使用MyBatis访问数据库

    如何在Spring Boot中使用MyBatis访问数据库

    MyBatis可以通过简单的XML或者注解来配置和映射原始类型,接口,和Java POJO为数据库中记录,使用MyBatis帮助我们解决各种问题,本文介绍如何在Spring Boot中使用MyBatis访问数据库,感兴趣的朋友一起看看吧
    2023-11-11
  • IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)

    IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)

    这篇文章主要介绍了IDEA 使用mybatis插件Free Mybatis plugin的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 浅谈Java基准性能测试之JMH

    浅谈Java基准性能测试之JMH

    JMH是Java Microbenchmark Harness的简称,一个针对Java做基准测试的工具。想准确的对一段代码做基准性能测试并不容易,因为JVM层面在编译期、运行时对代码做很多优化,当代码块处于整个系统中运行时并不一定会生效,产生错误的基准测试结果,这个问题就是JMH要解决的
    2021-06-06
  • Intellij IDEA导入eclipse web项目的操作步骤详解

    Intellij IDEA导入eclipse web项目的操作步骤详解

    Eclipse当中的web项目都会有这两个文件,但是idea当中应该是没有的,所以导入会出现兼容问题,但是本篇文章会教大家如何导入,并且导入过后还能使用tomcat运行,需要的朋友可以参考下
    2023-08-08
  • Java Semaphore实现高并发场景下的流量控制

    Java Semaphore实现高并发场景下的流量控制

    在java开发的工作中是否会出现这样的场景,你需要实现一些异步运行的任务,该任务可能存在消耗大量内存的情况,所以需要对任务进行并发控制。本文将介绍通过Semaphore类优雅的实现并发控制,感兴趣的可以了解一下
    2021-12-12
  • java中RabbitMQ高级应用

    java中RabbitMQ高级应用

    本文主要介绍了java中RabbitMQ高级应用,中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Spring boot 运用策略模式实现避免多次使用if的操作代码

    Spring boot 运用策略模式实现避免多次使用if的操作代码

    这篇文章主要介绍了Spring boot 运用策略模式实现,避免多次使用if,使用策略模式后,新加一种支付策略时,只需要在策略枚举中添加新加的策略信息,外加一个策略类即可,而不再需要添加新的if判断,需要的朋友可以参考下
    2022-08-08
  • spring boot使用thymeleaf跳转页面实例代码

    spring boot使用thymeleaf跳转页面实例代码

    本篇文章主要介绍了spring boot使用thymeleaf跳转页面,实例介绍了thymeleaf的原理和介绍,有兴趣的可以了解一下。
    2017-04-04
  • JavaSE-面向对象(方法重写)

    JavaSE-面向对象(方法重写)

    子类在调用父类的私有方法中不能直接调用,但是可以通过get方法进行调用,修改属性的值可以通过set方法进行修改。而子类想要修改父类中的方法可以使用方法重写进行操作。
    2021-08-08
  • Spring Session的使用示例

    Spring Session的使用示例

    最近团队一个项目需要使用Session,之前没有在实际项目中使用过Spring-Session,这里记录一下使用的过程
    2021-06-06

最新评论