NIO之非阻塞模式

这篇具有很好参考价值的文章主要介绍了NIO之非阻塞模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        NIO支持非阻塞模式,以网络连接和网络数据传输为例。如果使用阻塞模式,ServerSocketChannel在调用accept等待客户端建立连接是阻塞的,没有连接就一直阻塞。从Channel中读取客户端传送的数据也是阻塞的,没有数据就一直阻塞。当我们开启非阻塞模式,等待连接建立时没有连接就返回null,等到数据时没有数据就返回0。

// 使用 nio 来理解非阻塞模式, 单线程
// 0. ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(16);
// 1. 创建了服务器
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false); // 非阻塞模式
// 2. 绑定监听端口
ssc.bind(new InetSocketAddress(8080));
// 3. 连接集合
List<SocketChannel> channels = new ArrayList<>();
while (true) {
    // 4. accept 建立与客户端连接, SocketChannel 用来与客户端之间通信
    SocketChannel sc = ssc.accept(); // 非阻塞,线程还会继续运行,如果没有连接建立,但sc是null
    if (sc != null) {
        log.debug("connected... {}", sc);
        sc.configureBlocking(false); // 非阻塞模式
        channels.add(sc);
    }
    for (SocketChannel channel : channels) {
        // 5. 接收客户端发送的数据
        int read = channel.read(buffer);// 非阻塞,线程仍然会继续运行,如果没有读到数据,read 返回 0
        if (read > 0) {
            buffer.flip();
            debugRead(buffer);
            buffer.clear();
            log.debug("after read...{}", channel);
        }
    }
}

        以上虽然是非阻塞模式,但是如果一直没有连接或者数据接收,会导致CPU空转,造成资源浪费。为此,最佳方式是使用Selector,其支持单线程绑定多个channel监听对应类型的事件,在防止完全非阻塞模式CPU空转的同时也避免了传统的完全阻塞模式下阻塞等待影响其他需要连接或有数据接收的channel的正常工作,这也就是NIO Selector的作用,后续会详细介绍。文章来源地址https://www.toymoban.com/news/detail-858850.html

到了这里,关于NIO之非阻塞模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • NIO 非阻塞式IO

    Java NIO 基本介绍 Java NIO 全称 Java non-blocking IO ,是指 JDK 提供的新 API 。从 JDK1.4 开始, Java 提供了一系列改进的输入/输出的新特性,被统称为 NIO (即 NewIO ),是同步非阻塞的。 NIO 相关类都被放在 java.nio 包及子包下,并且对原 java.io 包中的很多类进行改写。 NIO 有三大核心

    2024年02月13日
    浏览(39)
  • 阻塞非阻塞IO(BIO和NIO),IO多路复用

    1.概念 NIO(New Input/Output)和BIO(Blocking Input/Output)是Java中用于处理输入输出的两种不同的模型。   BIO 会 阻塞 ,等有了消息,立刻返回,一个线程处理一个recv(需要很多线程)。 NIO 有没有消息,都返回(但程序要自己判断,返回空就循环重复);一个线程可以处理多个

    2024年02月09日
    浏览(41)
  • 9.NIO非阻塞式网络通信入门

    一个 I/O 线程可以并发处理 N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞 I/O 一连接一线程模型。架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。 1、当客户端连接服务端时,服务端会通过 ServerSocketChannel 得到 SocketChannel:获取通道 java ServerSocketChanne

    2024年02月15日
    浏览(38)
  • 深入理解网络非阻塞 I/O:NIO

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:网络 I/O 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想

    2024年02月05日
    浏览(30)
  • JAVA的BIO、NIO、AIO模式精解(一)

    在不同系统或进程间数据交互,或高并发场景下都选哟网络通信。早期是基于性能低下的同步阻塞IO(BIO)实现。后支持非阻塞IO(NIO)。 前置须知:javsse,java多线程,javaIO,java网络模型 目的:局域网内通信,多系统间底层消息传递机制,高并发下大数据通信,游戏应用。 IO模型

    2023年04月27日
    浏览(37)
  • Java-NIO篇章(4)——Reactor反应器模式

    前面已经讲过了Java-NIO中的三大核心组件Selector、Channel、Buffer,现在组件我们回了,但是如何实现一个超级高并发的socket网络通信程序呢?假设,我们只有一台内存为32G的Intel-i710八核的机器,如何实现同时2万个客户端高并发非阻塞通信?可能你会说不可能实现,答案是2万的

    2024年01月22日
    浏览(61)
  • 为什么Tomcat的NIO在读取body时要模拟阻塞?

    文章首发地址 Tomcat的NIO完全可以以非阻塞方式处理IO,为什么在读取body部分时要模拟阻塞呢?在Tomcat的NIO读取HTTP请求时,为了保证请求的正确性和可靠性,需要模拟阻塞模式,这是因为servlet规范里定义了ServletInputStream在读数据时是阻塞模式。 ServletInputStream在读取数据时是阻

    2024年02月13日
    浏览(55)
  • Java 网络编程 —— 创建非阻塞的 HTTP 服务器

    HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序。HTTP 客户程序和 HTTP 服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。HTTP 严格规定了 HTTP 请求和 HTTP 响应的数据格式,只要 HTTP 服务器

    2024年02月06日
    浏览(48)
  • Java 网络编程 —— 实现非阻塞式的服务器

    当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的连接,必须使用多线程 在非阻塞模式下, EchoServer 只需要启动一个主线程,就能同时处理三件事: 接收客户的连接 接收客户发送的数据 向客户发回响应数据 EchoServer 委托 Selector 来负责监控接

    2024年02月05日
    浏览(55)
  • Java NIO 图解 Netty 服务端启动的过程

    了解整体Netty常用的核心组件后,并且对比了传统IO模式。在对比过程中,找到了传统IO对应Netty中是如何实现的。最后我们了解到在netty中常用的那些组件。 本文在了解下这些核心组件的前提下,进一步了解组件如何在整个服务器启动过程如何被创建,如何组件之间配合来使

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包