2019-04-30——Java NOI
2019-04-30 本文已影响0人
烟雨乱平生
经典java IO库
- 对于经典的IO除了Buffered开头的类,其他均没有加缓冲区,除非手动添加缓冲区
byte[] buffer = new byte[64];
inputStream.read(buffer);
- 经典io是标准的同步阻塞模型,即在read的过程中,会阻塞当前线程,直到取完数据。
NIO
java NIO加入了Channels、Buffers、Selector。通过他们可以为java的io添加非阻塞IO。
IO的四种模型
-
同步阻塞
image.png
同步是对于线程而言的,如果进行IO的操作是当前线程,则为同步的,所以同步阻塞会导致当前线程阻塞,一般来说java中会开一个独立的线程进行同步阻塞的操作,以免程序假死。这是经典模型。
-
同步非阻塞
image.png
同样是在一个线程中,不同的在于调用read()方法后立即返回,不阻塞。到底有没有获取数据,仍然需要我们在当前线程中判断read()的返回值,直到read()到值时再进行其他操作。与同步阻塞相比,阻塞的权限交给了代码编写者,同步阻塞是由jvm进行的阻塞(可能描述不标准),而同步非阻塞,其实还是需要我们在当前线程中轮训是否获取数据了,阻塞权交给了程序员。
-
IO多路复用
image.png
IO多路复用模型使用了Reactor设计模式实现了这一机制。
-
异步IO
image.png
异步IO模型使用了Proactor设计模式实现了这一机制