上一篇 <<<BIO和NIO区别
下一篇 >>>NIO模式的IO多路复用底层原理
Bio是阻塞式IO,当我们没有获取到数据的时候,整个应用程序会实现阻塞等待,不能实现做其他的事情。
BIO的特性:线程阻塞
当我们在调用io函数的时候,如果没有获取的数据的情况下,就会一直阻塞、整个阻塞的过程中 不可以去做其他的事情。
// 1.创建一个ServerSocket连接
final ServerSocket serverSocket = new ServerSocket();
// 2.绑定端口号
serverSocket.bind(new InetSocketAddress(9090));
// 3.当前线程放弃cpu资源等待获取数据
System.out.println("等待获取数据...");
/** 如果没有请求到来,accept方法会一直阻塞*/
Socket socket = serverSocket.accept();
System.out.println("获取到数据...");
// 4.读取数据
int read = socket.getInputStream().read(bytes);
String result = new String(bytes);
System.out.println(result);
使用多线程实现伪异步io的缺点
- a、不能支持并发;
- b、使用多线程读取socket的数据能加快速度,但多线程的创建也会非常消耗CPU资源
- c、存在线程安全问题
while (true) {
final Socket socket = serverSocket.accept();
executorService.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("获取到数据...");
// 4.读取数据
int read = socket.getInputStream().read(bytes);
String result = new String(bytes);
System.out.println(result);
} catch (Exception e) {
}
}
});
}
推荐阅读:
<<<OSI七层模型与层上协议
<<<TCP的三次握手建立链接和四次挥手释放链接
<<<TCP、UDP及Socket代码示例
<<<Https的1.0、2.0协议及长短链接区别
<<<Linux系统的五种IO模型
<<<BIO和NIO区别
<<<NIO模式的IO多路复用底层原理
<<<select、poll、epoll的区别
<<<Redis为什么单线程能够支持高并发
<<<Netty初识
<<<Netty的粘包和拆包问题分析
<<<粘包和拆包问题解决方案汇总
<<<序列化与反序列化知识点汇总
<<<MessagePack反序列化使用示例
<<<Marshalling在Netty中的使用