JAVA BIO

简介: 1.什么是同步阻塞同步、阻塞是两个概念,同步,即原地傻等,在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。同步是对客户端的描述,在等待服务端响应的请求时,客户端不做其他的事情。

1.什么是同步阻塞

同步、阻塞是两个概念,

同步,即原地傻等,在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。

同步是对客户端的描述,在等待服务端响应的请求时,客户端不做其他的事情。

阻塞,即卡住,是对服务端的描述。服务端会不会因为本来该开始处理请求,进行后续的业务逻辑了,但是因为请求的数据包还没有接收完(因为一个请求不一定是一个数据包发过来的,可能分成了好几个数据包),而需要卡在原地等待网络IO将数据包接收完才能继续往下走。

2.什么是BIO

BIO,同步阻塞,即传统的JAVA IO,相关类和接口在java.io包下,其线程模型如下:

5f5dcbefe1044d0188c5012e171a5479.png

BIO的线程模型呈现出以下特点: 一个连接一个线程,每个连接进来都对应着需要新启一个线程去负责处理该连接,可能出现处理连接的 线程被执行时所需的IO资源未准备好,造成线程被阻塞的情况出现。server端处理连接的请求一旦被阻 塞,client也会因为收不到响应而阻塞,因此client端、server端呈现出同步阻塞的特点。

3.Socket

BIO的核心是Socket,Socket是对TCP/IP通信过程的一个抽象,它将TCP/IP协议里面复杂的通信逻辑进行 封装,对用户来说,只要通过一组简单的API就可以实现网络的连接和通信。

13b36038f5e14de98163fa135a287bfe.png

4.BIO的缺点

BIO最后的实现效果是一个连接一个线程。原因是服务端每accept一个socket后,就算主线程接下 来去处理这个Socket也只是处理了一个Socket,因此要并发的处理多个Socket,还是只能在服务端起多 个线程,每个线程处理一个Socket。因此才说一个Socket对应着一个线程。这时就会存在两个问题:

  1. 耗时严重
  2. 同步阻塞

耗时严重:

accept的socket并不知道其数据包是否已经收完,很可能出现因为数据包没有收完,还需要阻塞在原地等待IO继续收数据包的情况,本来分过来的CPU时间片是希望当前线程向下执行代码,结果用去继续IO收数据包去了,IO操作对于CPU而言很慢,时间片的利用率会很低,耗时会很严重。  

5.代码示例

客户端:

f08a58f2a3194d038734083df73d5627.png

服务端:

a98ea1ed6fea4a7faea6360a1144e21b.png

目录
相关文章
|
7月前
|
存储 网络协议 Java
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)(二)
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)
81 0
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)(二)
|
监控 网络协议 Java
Java 中 IO 之 BIO、NIO 和 AIO
IO 是 Input 和 Output 二词的缩写,意为输入和输出,直接来说,实现一般的 I/O 是没有什么难度的,但涉及到多线程时,要解决 I/O 的问题就不是一个简单的事情了,会涉及到同步和异步的问题,阻塞和非阻塞的问题。了解了(非)同步和(非)阻塞之后,我们再来看 I/O,根据是否同步和是否阻塞以及按它们出现的时间顺序,主要划分为 3 种 I/O 技术,分别是 BIO、NIO 和 AIO。当然,并不是只有这几种,还有其他的 I/O 类型。
98 3
|
4月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
92 2
|
5月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
179 1
|
6月前
|
Java 视频直播 数据库连接
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
Java I/O 模型详解:BIO、NIO 与 AIO 的特性与应用
69 2
|
5月前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
81 0
|
6月前
|
存储 监控 Java
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
深入探索Java BIO与NIO输入输出模型:基于文件复制和socket通信
|
7月前
|
编解码 网络协议 Java
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
用Java的BIO和NIO、Netty实现HTTP服务器(一) BIO与绪论
|
7月前
|
网络协议 Java Unix
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)(一)
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)
114 0
【Java】BIO源码分析和改造(GraalVM JDK 11.0.19)(一)
|
7月前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现