阻塞与非阻塞IO
JAVA IO的各种流是阻塞的,这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。
该线程在此期间不能再干任何事情了。
阻塞式网络 IO 的特点:多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。
阻塞的结果就是会带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听一个端口,一天只会有几次请求进来,
但是该 cpu 不得不为该线程不断做上下文切换尝试,大部分的切换以阻塞告终。
一辆从 A 开往 B 的公共汽车上,路上有很多点可能会有人下车。司机不知道哪些点会有哪些人会下车,对于需要下车的人,如何处理更好?
1. 司机过程中定时询问每个乘客是否到达目的地,若有人说到了,那么司机停车,乘客下车。 ( 类似阻塞式 )
2. 每个人告诉售票员自己的目的地,然后睡觉,司机只和售票员交互,到了某个点由售票员通知乘客下车。 ( 类似非阻塞 )
很显然,每个人要到达某个目的地可以认为是一个线程,司机可以认为是 CPU 。在阻塞式里面,每个线程需要不断的轮询,上下文切换,以达到找到目的地的结果。
而在非阻塞方式里,每个乘客 ( 线程 ) 都在睡觉 ( 休眠 ) ,只在真正外部环境准备好了才唤醒,这样的唤醒肯定不会阻塞。
非阻塞的原理
把整个过程切换成小的任务,通过任务间协作完成。
由一个专门的线程来处理所有的 IO 事件,并负责分发。
事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。
简单的说:创建专门的线程来处理所有IO事件,并负责分发。(就是售票员,司机只和售票员交互,司机CPU)
使用wait() notify()来进行线程的切换,保证每次上下文切换都是有意义的。
以下是异步 IO 的结构:
Reactor 就是上面隐喻的售票员角色。每个线程的处理流程大概都是读取数据、解码、计算处理、编码、发送响应。
非阻塞的优势:减少了CPU线程切换的开销,减少了N个请求对应N个线程的阻塞资源(阻塞会一直轮询)
相关推荐
用Java实现非阻塞通信 java.nio包提供了支持非阻塞通信的类,主要包括: ● ServerSocketChannel:ServerSocket的替代类,支持阻塞通信与非阻塞通信。 ● SocketChannel:Socket的替代类,支持阻塞通信与非阻塞通信...
Java阻塞IO与非阻塞IO - OPEN 开发经验库
通过java网络编程深入理解socket阻塞通信和非阻塞通信的在网络中的应用 源码包每一行都有注释,在代码里面每一个类都有详细的注释来解释这个类的功能这个方法的功能,调用哪一个类的哪一个功能等等。 压缩包包含实验...
Java非阻塞套接字是Java 1.4引入的一项重要特性,它是Java NIO(New Input/Output)的一部分,提供了高效、灵活且可扩展的网络通信能力。非阻塞套接字允许在网络通信中使用套接字时,不会因为等待数据而阻塞应用程序...
虽然Java的标准IO库提供了阻塞输入,但Java NIO(New I/O)提供了一种非阻塞的输入方式。NIO的`Selector`可以监控多个通道(Channels),当数据准备好时,可以选择其中一个进行读取,而不会阻塞其他通道。这对于...
Java非阻塞通信是现代Java开发中的一个重要概念,特别是在高并发和高性能的系统设计中。非阻塞通信允许程序在等待数据就绪时不会被挂起,而是继续执行其他任务,提高了系统的整体效率。这种技术主要应用于网络I/O...
Java 同步、异步、阻塞和非阻塞分析 Java 中的同步、异步、阻塞和非阻塞是四个相关但不同的概念,它们都是在多线程编程中解决耗时操作的方法。在这里,我们将详细介绍这些概念之间的区别和联系。 同步...
在深入探讨Java网络编程中的非阻塞与阻塞编程之前,我们先来了解这两个概念的基本含义。阻塞编程,通常指的是在程序执行过程中,当某一部分代码遇到I/O操作时,如读写文件或网络通信,整个程序会暂停运行,等待I/O...
java开发的http服务器 采用NIO非阻塞模式 可以用于http服务器开发
非阻塞I/O,如Java NIO(New I/O)中的Selector和Channels,允许线程在数据未准备好时不会被阻塞,而是立即返回。这样,线程可以继续处理其他任务,提高系统的并发性。Java NIO通过多路复用技术实现,一个线程可以...
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...
本教程将深入讲解如何使用Java NIO实现非阻塞服务端与客户端的通信。 1. **Java NIO基础** - **通道(Channels)**:NIO中的通道类似于传统IO的流,但它们可以同时读写,并且支持非阻塞操作。 - **缓冲区...
Java NIO(New Input/Output)库自Java 1.4版本引入,为开发者提供了非阻塞I/O的支持。NIO的核心组件包括选择器(Selector)、通道(Channel)和缓冲区(Buffer)。通过选择器,一个线程可以监听多个通道上的事件,...
非阻塞聊天程序是一种设计用于高效通信的网络应用程序,它采用了Java编程语言来实现服务器端和客户端之间的实时交互。在传统的阻塞式I/O模型中,一个线程必须等待某个操作完成(如数据读取或写入)才能执行下一步,...
### 基于Java NIO的非阻塞通信的研究与实现 #### 摘要 本文探讨了Java NIO(New I/O)框架中的非阻塞通信机制,并对其原理及应用进行了深入研究。NIO是一种现代I/O处理方法,通过引入缓冲区、通道和选择器等新概念...
### Java非阻塞式通信详解 #### 一、线程阻塞的概念与影响 线程阻塞是指在程序运行过程中,线程遇到某些条件而暂时停止执行的状态,这种状态下线程将不会消耗CPU资源,直到阻塞条件解除。在传统的Java网络编程中,...
"JAVA非阻塞通信技术原理研究与实现" JAVA非阻塞通信技术原理研究与实现是指在JAVA平台上,服务端与客户端之间的通信过程中,不使用阻塞方式进行通信,而是使用非阻塞方式,来提高服务端的效率和灵活性。 非阻塞...
### 非阻塞异步传输Java网络编程 #### 实验背景及目标 本实验旨在通过Java语言实现一种基于自定义协议的文件传输系统,包括一个文件传输服务器(FileServer)和一个客户端(FileClient)。该系统的特点在于采用了非...
在Java中,通过使用java.nio包中的类可以实现非阻塞通信。 阻塞通信是指在发送或接收数据时,当前线程将被阻塞,直到数据发送或接收完成。这种模式下,线程将被阻塞,无法执行其他操作。例如,在使用阻塞Socket时,...
为了提高效率,可以采用多线程或者非阻塞I/O(如NIO,Java的新I/O库)来改进。但是,对于初学者来说,理解单线程阻塞模型是学习网络编程的基础,有助于深入理解Socket通信的工作原理。 此外,源码分析可以帮助我们...