博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java nio
阅读量:6005 次
发布时间:2019-06-20

本文共 680 字,大约阅读时间需要 2 分钟。

hot3.png

阻塞I/O调用InputStream.read()方法时是阻塞的,它会一直等到数据到来时(或超时)才会返回;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线程去处理该客户端的请求。阻塞I/O的通信模型示意图如下

缺点:1. 当客户端多时,会创建大量的处理线程。且每个线程都要占用栈空间和一些CPU时间

            2. 阻塞可能带来频繁的上下文切换,且大部分上下文切换可能是无意义的。

java NIO的工作原理:

1. 由一个专门的线程来处理所有的 IO 事件,并负责分发。 
2. 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。 
3. 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换

实现:

服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止

转载于:https://my.oschina.net/u/198077/blog/493015

你可能感兴趣的文章
敏捷的忠实拥护者David Hussman于8月18日去世
查看>>
yaf-example
查看>>
【leetcode】63. Unique Paths II 有障碍的棋盘走路路径数量
查看>>
如何通过Zeppelin查询Greenplum数据
查看>>
vscode 插件推荐 - 献给所有前端工程师(2018.4.29更新)
查看>>
从jar包中加载feignClient
查看>>
DSL概述
查看>>
Java Ajax jsonp 跨域请求
查看>>
这样的 StackView 动画,你想到了吗?
查看>>
操作系统思考 第零章 前言
查看>>
kmdjs和循环依赖
查看>>
Handler 系列二:怎么通信
查看>>
WorkPlus JS SDK
查看>>
基于ObjC的轻量级Promise库——RWPromiseKit
查看>>
Android单元测试(四):Mock以及Mockito的使用
查看>>
Android的性能优化
查看>>
Elm 架构教程
查看>>
Elixir交互式Shell: 1. 运行时系统标记
查看>>
Blender下用Python实现模型文件导入、渲染和动画生成
查看>>
【前端面试总结】2016-01-24
查看>>