导航:首页 > 编程语言 > javanio内存

javanio内存

发布时间:2024-05-08 05:47:23

java Nio读写为什么是双向

作者:美团技术团队
链接:https://zhuanlan.hu.com/p/23488863
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

那么NIO的本质是什么样的呢?它是怎样与事件模型结合来解放线程、提高系统吞吐的呢?

本文会从传统的阻塞I/O和线程池模型面临的问题讲起,然后对比几种常见I/O模型,一步步分析NIO怎么利用事件模型处理I/O,解决线程池瓶颈处理海量连接,包括利用面向事件的方式编写服务端/客户端程序。最后延展到一些高级主题,如Reactor与Proactor模型的对比、Selector的唤醒、Buffer的选择等。

注:本文的代码都是伪代码,主要是为了示意,不可用于生产环境。

传统BIO模型分析

让我们先回忆一下传统的服务器端同步阻塞I/O处理(也就是BIO,Blocking I/O)的经典编程模型:

{
ExecutorService executor = Excutors.newFixedThreadPollExecutor(100);//线程池

ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(8088);
while(!Thread.currentThread.isInturrupted()){//主线程死循环等待新连接到来
Socket socket = serverSocket.accept();
executor.submit(new ConnectIOnHandler(socket));//为新的连接创建新的线程
}

class ConnectIOnHandler extends Thread{
private Socket socket;
public ConnectIOnHandler(Socket socket){
this.socket = socket;
}
public void run(){
while(!Thread.currentThread.isInturrupted()&&!socket.isClosed()){死循环处理读写事件
String someThing = socket.read()....//读取数据
if(someThing!=null){
......//处理数据
socket.write()....//写数据
}

}
}
}

这是一个经典的每连接每线程的模型,之所以使用多线程,主要原因在于socket.accept()、socket.read()、socket.write()三个主要函数都是同步阻塞的,当一个连接在处理I/O的时候,系统是阻塞的,如果是单线程的话必然就挂死在那里;但CPU是被释放出来的,开启多线程,就可以让CPU去处理更多的事情。其实这也是所有使用多线程的本质:

阅读全文

与javanio内存相关的资料

热点内容
三星qx2是什么安卓系统 浏览:205
保鲜膜解压球教学视频 浏览:601
多媒体算法工程师camera 浏览:987
电脑下载的歌可以拉到文件夹吗 浏览:722
千锋3g学院android 浏览:445
linux中的yum命令 浏览:239
压缩面膜有几种 浏览:575
怎么更改安卓程序级别 浏览:393
安卓系统运行慢怎么办呢 浏览:808
外地人在买车本地可以解压嘛 浏览:907
相册软件加密怎么取消 浏览:251
麦克风app怎么打开 浏览:22
java泛型t和 浏览:356
计算机英文pdf 浏览:587
单片机控制的直流调速系统 浏览:130
抖音上解压视频书单号怎么做 浏览:165
软件加密之后忘了密码怎么办 浏览:944
文件夹怎么弹出来的 浏览:209
51单片机引脚图电路 浏览:214
麦当劳员工怎么登录app 浏览:530