Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言,Java 当初诞生的时候,正是上世纪 90 年代末互联网兴起的时代,在企业应用开发中存在几个问题,一是以 IBM,SUN 和 HP 的 UNIX 服务器和大型机为主的异构环境,C/C++ 和其它语言编写的应用跨平台支持和移植比较困难,二是基于 CGI 和其它技术的网络应用从开发效率和功能性角度来看都不够理想,三是 C/C++在当时是主流编程语言,门槛高、易出错、对经验要求很高,而 Java 简单易学、安全可靠,并且一次编写到处运行,再加上 Applet、Servlet 和 JSP 技术,解决了这些痛点,满足了当时互联网程序设计和运维的要求,伴随着互联网的发展一下子就脱颖而出并长期占据主流地位。
2021年09月30日 标准的 Java IO API,你操作的对象是字节流(byte stream)或者字符流(character stream),而 NIO,你操作的对象是 channels 和 buffers。数据总是从一个 channel 读到一个 buffer 上,或者从一个 buffer 写到 channel 上。比如一个线程里,可以从一个 channel 读取数据到一个 buffer 上,在 channel 读取数据到 buffer 的时候,线程可以做其他的事情。当数据读取到 buffer 上后,线程可以继续处理它。
Java NIO 有三个核心组件(core components):Channels、Buffers、Selectors。
Java NIO 有三个核心组件(core components):Channels、Buffers、Selectors。
2021年09月30日 除信号驱动模型外,Java 对其它四种 IO 模型都有支持;其中 Java 最早提供的 blocking IO 即是阻塞 IO,而 NIO 即是非阻塞 IO,同时 NIO 中的 Reactor 模式即是 IO 多路复用模型的实现,通过 AIO 实现的 Proactor 模式即是异步 IO 模型的实现。
Java 中传统的 IO 都是阻塞 IO,比如通过 socket 来读数据,调用 read 方法之后,如果数据没有就绪,当前线程就会一直阻塞在 read 方法调用那里,直到有数据才返回。因此在传统的网络服务设计模式中,比较经典的模式是多线程或线程池。当一条线程正在处理一个 client 的请求时,它是阻塞的状态,这时如果又来了一个 client 的请求,只好再启动一个新的线程去服务它,一个线程的阻塞不会影响其他线程工作。这种服务方式虽然看起来简便,但服务器为每个 client 都启动一个线程,资源消耗非常大。线程池的方式使得线程可以重复使用,在一定程度上减少了创建和销毁线程的系统开销。
多线程(或线程池)模式适用于大部分的连接为短连接的情景。如果大部分的连接都为长连接,而同一时刻只有少数的连接中存在 IO 操作,那么为每一个连接安排一个线程的服务方式是非常浪费的。因此便出现了如下的高性能 IO 模型:采用 Reactor 模式的 Java NIO 模型,这也是 Reactive Programming 中最为重要的概念。
Java 中传统的 IO 都是阻塞 IO,比如通过 socket 来读数据,调用 read 方法之后,如果数据没有就绪,当前线程就会一直阻塞在 read 方法调用那里,直到有数据才返回。因此在传统的网络服务设计模式中,比较经典的模式是多线程或线程池。当一条线程正在处理一个 client 的请求时,它是阻塞的状态,这时如果又来了一个 client 的请求,只好再启动一个新的线程去服务它,一个线程的阻塞不会影响其他线程工作。这种服务方式虽然看起来简便,但服务器为每个 client 都启动一个线程,资源消耗非常大。线程池的方式使得线程可以重复使用,在一定程度上减少了创建和销毁线程的系统开销。
多线程(或线程池)模式适用于大部分的连接为短连接的情景。如果大部分的连接都为长连接,而同一时刻只有少数的连接中存在 IO 操作,那么为每一个连接安排一个线程的服务方式是非常浪费的。因此便出现了如下的高性能 IO 模型:采用 Reactor 模式的 Java NIO 模型,这也是 Reactive Programming 中最为重要的概念。
一个处于萌芽阶段的知识库,用于持续分享自己的所见、所学、所思!
作者:heibaiying
博客:https://blog.csdn.net/m0_37809146
作者:heibaiying
博客:https://blog.csdn.net/m0_37809146
2021年12月07日 缓冲区 Buffer、通道 Channel、选择器 Selector、实现多人聊天室