什么是阻塞IO?

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
简介: **阻塞IO是一种IO操作模式,使得调用线程在IO未完成时会暂停,等待操作完成。简单但可能导致线程阻塞,适用于低并发、长处理场景。Java示例中,`ServerSocket`和`Socket`展示了这种模式。服务端接收到客户端连接后读取数据,回应"Echo",每个连接需单独线程处理。高并发时可考虑非阻塞IO(NIO)或异步IO来优化。**

阻塞IO的概念

阻塞IO(Blocking IO)是一种IO操作模式。在这种模式下,当一个IO操作(如读、写)执行时,如果不能立即完成操作,程序会暂停执行,直到操作完成。简单来说,阻塞IO会使调用线程等待IO操作的完成,无法继续处理其他任务。

特点

  • 简单性:编程模型简单,易于理解和实现。
  • 线程阻塞:IO操作会导致线程阻塞,等待IO操作完成。
  • 适用场景:适用于连接数较少且每个连接需要较长时间处理的场景,以字节为传输单位。

阻塞IO的Java示例

下面是一个使用Java进行阻塞IO操作的简单示例。这段代码展示了如何使用ServerSocketSocket进行阻塞IO操作。

代码示例

服务端代码

java

代码解读

复制代码

public class TCPServer {  
  
    public static void main(String[] args) throws IOException {  
        System.out.println("服务的启动...");  
        System.out.println("开始监听9999端口");  
        ServerSocket ss = new ServerSocket(9999);  
        while (true){  
            // 等待客户端连接  
            Socket accept = ss.accept();  
            // 处理客户端请求  
            InputStream is = accept.getInputStream();  
            byte[] b = new byte[10];  
            is.read(b);  
            String clientIP = accept.getInetAddress().getHostAddress();  
            System.out.println(clientIP + "说:" + new String(b));  
            // 回复客户端消息  
            OutputStream os = accept.getOutputStream();  
            os.write("Echo".getBytes());  
            // 关闭  
            accept.close();  
        }  
    }  
}

客户端代码

java

代码解读

复制代码

public class TCPClient {  
    public static void main(String[] args) throws IOException {  
        while (true){  
            //创建socket对象  
            Socket s = new Socket("127.0.0.1", 9999);  
            OutputStream os = s.getOutputStream();  
            System.out.println("请输入:");  
            Scanner sc = new Scanner(System.in);  
            String input = sc.nextLine();  
            os.write(input.getBytes());  
            //获得服务端的响应  
            byte[] b = new byte[1024];  
            int len = s.getInputStream().read(b);  
            System.out.println("服务端回复:" + new String(b, 0, len));  
            //关闭连接  
            s.close();  
        }  
    }  
}

运行说明

  1. 启动服务端:首先编译并运行TCPServer。服务端会在9999端口上监听客户端连接。
  2. 启动客户端:然后编译并运行TCPClient。客户端会连接到服务端,并可以输入消息发送到服务端。
  3. 交互:客户端发送的每条消息,服务端会接收并返回一个“Echo”响应。

总结

阻塞IO适用于简单的网络应用,但在高并发场景下效率较低,因为每个连接会占用一个线程,可能导致线程资源耗尽。为了解决高并发问题,可以使用非阻塞IO(如NIO)或异步IO技术。


转载来源:https://juejin.cn/post/7390686791776862235

相关文章
|
3月前
|
存储 Java 芯片
BIO 阻塞IO流 数据存储
为了弄清楚 I/O 流 的执行原理,首先需要了解数据在磁盘中的存储方式。目前进行数据存储的磁盘分为两种:机械磁盘、固态硬盘。
|
2月前
|
Java Unix Linux
什么是阻塞IO和非阻塞IO
什么是阻塞IO和非阻塞IO
|
1月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
|
9月前
阻塞IO、非阻塞IO和IO复用有啥区别?
阻塞IO、非阻塞IO和IO复用有啥区别?
65 1
|
10月前
|
Java Unix Linux
深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用
I/O(Input/Output)模型是计算机科学中的一个关键概念,它涉及到如何进行输入和输出操作,而这在计算机应用中是不可或缺的一部分。在不同的应用场景下,选择正确的I/O模型是至关重要的,因为它会影响到应用程序的性能和响应性。本文将深入探讨四种主要I/O模型:阻塞,非阻塞,多路复用,signal driven I/O,异步IO,以及它们的应用。
深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用
|
11月前
|
算法 Linux C语言
Linux驱动IO篇——阻塞/非阻塞IO
Linux驱动IO篇——阻塞/非阻塞IO
|
JavaScript 前端开发 安全
Node.js 中的阻塞和非阻塞io
Node.js 中的阻塞和非阻塞io
121 0
|
消息中间件 弹性计算 网络协议
IO:阻塞和非阻塞、同步和异步
当数据还没准备好时,调用了阻塞的方法,则线程会被挂起,会让出CPU时间片,此时是无法处理过来的请求,需要等待其他线程来进行唤醒,该线程才能进行后续操作或者处理其他请求。
198 0
|
1月前
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用