• NIO之非阻塞模式


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

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

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

  • 相关阅读:
    多态(个人学习笔记黑马学习)
    HTML5+CSS3+JS小实例:涟漪特效按钮
    基于springboot+vue的爱心助农网站(前后端分离)
    使用Flink完成流数据统计
    地下水除砷工艺
    ASEMI肖特基二极管SS210L参数,SS210L规格,SS210L封装
    机器人命令表设计
    pnpm:高效、快速的npm
    Linux dup和dup2
    招聘程序员(软件开发工程师),如何做岗位胜任力测评?
  • 原文地址:https://blog.csdn.net/m0_60424152/article/details/138049139