java线程模型

线程模型

  1. 传统BIO编程
  2. 伪异步I/O编程
  3. NIO编程
  4. AIO编程

1.传统BIO编程

网络编程的基本模型是 Client/Server 模型,也就是两个进程之间 进行相互通信,其中服务端提供位置信息(绑定的 IP 地址和监听端口),客 户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连 接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。

在基于传统同步阻塞模型开发中,ServerSocket 负责绑定 IP 地址, 启动监听端口;Socket 负责发起连接操作。连接成功之后,双方通过输入和 输出流进行同步阻塞式通信。

传统BIO编程

该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增 加后,服务端的线程个数和客户端并发访问数呈 1:1 的正比关系,由于线程 是 Java 虚拟机非常宝贵的系统资源,当线程数膨胀之后,系统的性能将急剧 下降,随着并发访问量的继续增大,系统会发生线程堆栈溢出、创建新线程 失败等问题,并最终导致进程宕机或者僵死,不能对外提供服务。

2.伪异步I/O编程

为了解决同步阻塞 I/O 面临的一个链路需要一个线程处理的问题,后来有人 对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入, 形成客户端个数 M:线程池最大线程数 N 的比例关系,其中 M 可以远远大于 N, 通过线程池可以灵活的调配线程资源,设置线程的最大值,防止由于海量并发接 入导致线程耗尽。

伪异步I/O编程

伪异步 I/O 实际上仅仅只是对之前 I/O 线程模型的一个简单优化,它无法从 根本上解决同步 I/O 导致的通信线程阻塞问题。

3NIO编程

在介绍 NIO 编程之前,我们首先需要澄清一个概念:NIO 到底是什么的简称? 有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法。但是,由于之前老的 I/O 类库是阻塞 I/O,New I/O 类 库的目标就是要让 Java 支持非阻塞 I/O,所以,更多的人喜欢称之为非阻塞 I/ O(Non-block I/O),由于非阻塞 I/O 更能够体现 NIO 的特点,所以本文使用的 NIO 都指的是非阻塞 I/O。

与 Socket 类 和 ServerSocket 类 相 对 应,NIO 也 提 供 了 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现。这两种新增的通道都支持阻 塞和非阻塞两种模式。阻塞模式使用非常简单,但是性能和可靠性都不好,非阻 塞模式则正好相反。开发人员一般可以根据自己的需要来选择合适的模式,一般 来说,低负载、低并发的应用程序可以选择同步阻塞 I/O 以降低编程复杂度,但 是对于高负载、高并发的网络应用,需要使用 NIO 的非阻塞模式进行开发。

4AIO编程

NIO2.0 引入了新的异步通道的概念,并提供了异步文件通道和异步套接字 通道的实现。异步通道提供两种方式获取获取操作结果:
• 通过java.util.concurrent.Future类来表示异步操作的结果; • 在执行异步操作的时候传入一个java.nio.channels;
• CompletionHandler接口的实现类作为操作完成的回调。
NIO2.0 的异步套接字通道是真正的异步非阻塞 I/O,它对应 UNIX 网络编程 中的事件驱动 I/O(AIO),它不需要通过多路复用器(Selector)对注册的通 道进行轮询操作即可实现异步读写,从而简化了 NIO 的编程模型。

几种I/O模型对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值