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

热点内容
sql数据库查询表命令 浏览:551
简单音乐网站源码 浏览:644
运动健康app华为手表怎么连接 浏览:748
肌肉塑造全书pdf下载 浏览:796
安卓简约拼图用什么软件好 浏览:289
fx1n加密程序 浏览:844
淘客阿里云服务器 浏览:476
100压缩打造 浏览:422
安卓手机怎么和苹果平板传文件 浏览:973
开始选项卡中的页眉和页脚命令选项 浏览:424
pdf的字体怎么改 浏览:856
python读写视频 浏览:88
科鲁兹压缩机轴承 浏览:353
word文档转换成pdf文件找不到 浏览:27
组件注册命令 浏览:760
安卓大屏导航用的是什么运放 浏览:443
myandroidtools的备份 浏览:900
python爬虫天气预报 浏览:761
android70权限管理 浏览:749
魔兽辛迪加是什么服务器 浏览:472