导航:首页 > 编程语言 > 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内存相关的资料

热点内容
房产证加密收费吗 浏览:151
slam算法处理数据 浏览:265
如何判断服务器ip地址和版本号 浏览:963
python获取html内容 浏览:768
北欧大神程序员 浏览:204
安卓手机怎么拍出照片的质感 浏览:833
编译后的病毒长什么样子 浏览:21
围棋与程序员 浏览:260
加密和解密的单词 浏览:981
我的世界td服务器怎么注册 浏览:413
编译器的堆空间 浏览:599
云引擎云服务器 浏览:907
解压视频声控吃冰意大利 浏览:406
涡旋压缩机动涡盘 浏览:879
手机邮件发文件夹 浏览:449
魔兽世界怀旧服tbc萨满宏命令 浏览:549
linuxsvn手册 浏览:269
程序员图鉴 浏览:539
东营程序员 浏览:716
发票上传参数没置服务器地址 浏览:49