BIO和NIO区别

1) BIO以流的方式处理数据,而 NIO 以块的方式处理数据,块TO 的效率比流TO高很多              2)BIO是阻塞的,NIO 则是非阻塞的
3) BIO基于字节流和字符流进行操作,而 NIO 基于Channel(通道)和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道
 

### BIONIO的概念 #### 同步阻塞I/O (BIO) 同步阻塞I/O是一种传统的I/O模型,在这种模式下,当程序发起读写请求时会一直等待直到操作完成并返回结果。这意味着如果当前线程正在执行一个I/O调用,则该线程会被挂起直至整个过程结束[^1]。 #### 非阻塞I/O (NIO) 非阻塞I/O是在Java 1.4版本被引入的新特性之一。其核心在于能够在一个单独的线程内同时监控多个通道的状态变化,并允许应用程序注册感兴趣的事件类型(如可读、可写)。一旦某个特定条件满足,比如有新的客户端连接到来或是套接字准备就绪可以发送数据包等情况下,操作系统就会通知对应的处理器去处理相应的任务而无需让主线程处于闲置状态等待响应。这种方式极大地提高了系统的吞吐量特别是在面对大量短时间交互频繁的小型消息传递场景中表现尤为突出[^2]。 ### 主要差异 | 特征 | BIO | NIO | | --- | --- | --- | | **并发处理能力** | 每个连接都需要独立的工作线程来进行通信;对于大规模并发访问支持较差 | 单一线程可以通过选择器机制高效地管理监听众多Channel对象的变化情况从而实现更高的并发度 | | **资源消耗** | 创建过多线程可能导致严重的上下文切换开销以及内存占用过高问题 | 更少数量级上的线程即可胜任相同规模的任务因此整体上降低了硬件成本 | | **编程复杂度** | 实现较为简单直观易于理解维护 | 设计理念更为抽象需要开发者具备一定的经验才能熟练掌握 | ### 应用场景 - 对于低并发的应用环境来说,采用BIO可能更加合适因为它的编码相对容易理解而且不需要额外考虑复杂的多线程同步逻辑。 - 当面临高负载需求特别是实时性强的数据流传输业务时则推荐使用NIO方案来优化性能瓶颈提升服务端的最大承载力。 ```java // 使用NIO创建服务器SocketChannel实例 ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); // 设置为非阻塞模式 InetSocketAddress address = new InetSocketAddress(8080); serverChannel.socket().bind(address); Selector selector = Selector.open(); // 打开一个新的Selector用于轮询已注册的channel是否有待处理的操作 serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 注册到selector上关注accept事件 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值