iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java NIO类库Selector机制是什么
  • 153
分享到

Java NIO类库Selector机制是什么

2023-06-17 11:06:42 153人浏览 安东尼
摘要

这篇文章主要介绍“Java NIO类库Selector机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Nio类库Selector机制是什么”文章能帮助大家解决问题。迷惑不解 : 为

这篇文章主要介绍“Java NIO类库Selector机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java Nio类库Selector机制是什么”文章能帮助大家解决问题。

迷惑不解 : 为什么要自己消耗资源?

令人不解的是为什么我们的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,只需要朝着自己的这个loopback连接发点数据过去,于是,就可以唤醒阻塞在select上的线程了。

真相大白 : 可爱的Java你太不容易了

使用Linux下的strace命令,我们可以方便地证明这一点。参看下图。图中,请注意下面几点:

1)  26654是主线程,之前我输出notify the select字符串是为了做一个标记,而不至于迷失在大量的strace log中。

2)  26662是侦听线程,也就是select阻塞的线程。

3)  图中选中的两行。26654的write正是wakeup()方法的系统调用,而紧接着的就是26662的epoll_wait的返回。

Java NIO类库Selector机制是什么

从上图可见,这和我们之前的猜想正好一样。可见,jdk的Selector自己和自己建的那些TCP连接或是pipe,正是用来实现Selector的notify和wakeup的功能的。

这两个方法完全是来模仿Linux中的的kill和pthread_kill给阻塞在select上的线程发信号的。但因为发信号这个东西并不是一个跨平台的标准(pthread_kill这个系统调用也不是所有Unix/Linux都支持的),而pipe是所有的Unix/Linux所支持的,但Windows又不支持,所以,Windows用了TCP连接来实现这个事。

关于Windows,我一直在想,Windows的防火墙的设置是不是会让Java的类似的程序执行异常呢?呵呵。如果不知道Java的SDK有这样的机制,谁知道会有多少个程序为此引起的问题度过多少个不眠之夜,尤其是Java程序员。

关于“Java NIO类库Selector机制是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Java NIO类库Selector机制是什么

本文链接: https://www.lsjlt.com/news/288805.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java NIO类库Selector机制是什么
    这篇文章主要介绍“Java NIO类库Selector机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java NIO类库Selector机制是什么”文章能帮助大家解决问题。迷惑不解 : 为...
    99+
    2023-06-17
  • Java NIO类库Selector机制的原理
    本篇内容主要讲解“Java NIO类库Selector机制的原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java NIO类库Selector机制的原理”吧! 一、  前...
    99+
    2023-06-17
  • Java NIO中Selector是什么
    这篇文章将为大家详细讲解有关Java NIO中Selector是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Selector 简介1、Selector 和 Channel 关系Sele...
    99+
    2023-06-29
  • java中什么是Selector
    这篇文章给大家介绍java中什么是Selector,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模...
    99+
    2023-06-14
  • java强类型机制是什么
    Java强类型机制是指在Java语言中,变量必须先声明才能被使用,并且声明时必须指定变量的数据类型。在强类型机制下,变量的数据类型决...
    99+
    2023-08-31
    java
  • java中是什么是NIO
    java中是什么是NIO?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了...
    99+
    2023-06-14
  • Java类的加载机制是什么
    这篇文章主要讲解了“Java类的加载机制是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类的加载机制是什么”吧!1、什么是类的加载类的加载指的是将类的.class文件中的二进制数...
    99+
    2023-06-17
  • java中各类锁的机制是什么
    这篇文章给大家分享的是有关java中各类锁的机制是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言总结java常见的锁区分各个锁机制以及如何使用使用方法锁名考察线程是否要锁住同步资源乐观锁和悲观锁锁住同步资...
    99+
    2023-06-22
  • Java NIO底层原理是什么
    这篇文章主要介绍“Java NIO底层原理是什么”,在日常操作中,相信很多人在Java NIO底层原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java NIO底层原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • Java NIO是什么及怎么使用
    Java NIO(New IO)是Java 1.4版本中引入的一种用于替代传统Java IO的新的输入输出API。NIO提供了更高效...
    99+
    2023-09-27
    Java
  • Java NIO Buffer实现原理是什么
    本篇内容介绍了“Java NIO Buffer实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Buffe...
    99+
    2023-06-21
  • tomcat类加载机制是什么
    Tomcat的类加载机制是指Tomcat服务器在运行过程中,如何加载和管理Java类文件的过程。它主要包括以下几个步骤:1. Boo...
    99+
    2023-09-15
    tomcat
  • Java的SPI机制是什么
    本篇内容介绍了“Java的SPI机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SPI的全名为Service Provider In...
    99+
    2023-06-17
  • Java的ClassLoader机制是什么
    本篇内容介绍了“Java的ClassLoader机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JVM在加载类的时候,都是通过Cla...
    99+
    2023-06-17
  • 什么是Java回调机制
    这篇文章主要讲解了“什么是Java回调机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Java回调机制”吧!一、回调回调分为同步回调和异步回调, 假如以买彩票的场景来模拟, 我买彩票...
    99+
    2023-06-20
  • java反射机制是什么
    这篇文章主要介绍了java反射机制是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
  • Java NIO Socket通信的方法是什么
    这篇文章主要讲解了“Java NIO Socket通信的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO Socket通信的方法是什么”吧!服务器代码:import&...
    99+
    2023-06-17
  • Java NIO的ByteBuffer工作原理是什么
    这篇文章给大家介绍Java NIO的ByteBuffer工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 APINetty 的数据处理 API 通过两个组件暴露——抽象类ByteBuf 和 接口 Byte...
    99+
    2023-06-15
  • spring类的加载机制是什么
    Spring框架的类加载机制主要涉及到两个方面:类路径扫描和类加载器。 类路径扫描:Spring框架在启动时会扫描应用程序的类路...
    99+
    2024-04-02
  • Java NIO性能测试的方法是什么
    这篇文章主要介绍“Java NIO性能测试的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java NIO性能测试的方法是什么”文章能帮助大家解决问题。时间(ms)文件大小(byte)Bu...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作