Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 的 NIO 是如何工作的?

Java 的 NIO 是如何工作的?

作者头像
水货程序员
修改于 2018-11-16 01:59:07
修改于 2018-11-16 01:59:07
1.7K00
代码可运行
举报
文章被收录于专栏:javathingsjavathings
运行总次数:0
代码可运行

在这个数据爆炸的时代,有大量的数据在系统中流动,一个应用系统的瓶颈往往都是 IO 瓶颈。传统的 javaIO 模型是 BIO,也就是同步阻塞 IO,数据在写入 OutputStream 或者从 InputStream 读取时,如果没有数据没有读到或写完,线程都会被阻塞,处于等待状态,直到数据读取完成或写入完成。而在网络编程中,每一个客户端连接发出后,服务端都会有一个对应线程来处理请求,服务器线程与并发数成 1:1 关系,然而一个服务器所能处理的线程是有限的,处理高并发时就会有问题。

NIO 是一种非阻塞同步 IO,它是一种 Reactor 模式的编程模型,简单来讲,就是当服务端有多个连接接入时,并不为每个连接单独创建线程,而是创建一个 Reactor 线程,用多路复用器来不断的轮询每一个接入的连接,找出有数据需要读写的连接进行后续操作,从而具有处理多个连接的能力。

java 原生的 NIO 实现有很多类和组件,但其核心组件有三个,其他的都是一些相关的工具类:

  • Channel    与 BIO 中的流不同,NIO 用 Chananl 来抽象数据通道,数据通过 Channel 来读取和写入,从 Channle 的类图来看,通道分为两大类:用于网络读写的 SelectableChannel 和用于文件读写的 FileChannel
  • Buffer     在 NIO 中,数据与 Channel 之间的交互是通过 buffer 来进行的,数据读写先经过 buffer 再进入通道
  • Selector   多路复用器 Selector 是 NIO 的基础。Selector 会不断轮询注册在其上面的 Channel,如果某个 Channel 上发生读或写事件,这个 Channel 就处于就绪状态,会被 Selector 轮询出来,然后通过 SelectionKey 可以获取就绪 Channel 集合,让后异步的将 Channel 的数据读入缓冲区

下面是一个简单 NIO 服务器,用来演示 NIO 的编程模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
 
import javax.swing.text.html.HTMLDocument.Iterator;
 
/**
* Simple echo-back server which listens for incoming stream connections and
* echoes back whatever it reads. A single Selector object is used to listen to
* the server socket (to accept new connections) and all the active socket
* channels.
* @author zale (zalezone.cn)
*/
public class SelectSockets {
    public static int PORT_NUMBER = 1234;
    public static void main(String[] argv) throws Exception 
    {
        new SelectSockets().go(argv);
    }
    public void go(String[] argv) throws Exception 
    {
        int port = PORT_NUMBER;
        if (argv.length > 0) 
        { // 覆盖默认的监听端口
            port = Integer.parseInt(argv[0]);
        }
        System.out.println("Listening on port " + port);
        ServerSocketChannel serverChannel = ServerSocketChannel.open();// 打开一个未绑定的serversocketchannel
        ServerSocket serverSocket = serverChannel.socket();// 得到一个ServerSocket去和它绑定 
        Selector selector = Selector.open();// 创建一个Selector供下面使用
        serverSocket.bind(new InetSocketAddress(port));//设置server channel将会监听的端口
        serverChannel.configureBlocking(false);//设置非阻塞模式
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);//将ServerSocketChannel注册到Selector
        while (true) 
        {
            // This may block for a long time. Upon returning, the
            // selected set contains keys of the ready channels.
            int n = selector.select();
            if (n == 0) 
            {
                continue; // nothing to do
            }           
            java.util.Iterator<SelectionKey> it = selector.selectedKeys().iterator();// Get an iterator over the set of selected keys
            //在被选择的set中遍历全部的key
            while (it.hasNext()) 
            {
                SelectionKey key = (SelectionKey) it.next();
                // 判断是否是一个连接到来
                if (key.isAcceptable()) 
                {
                    ServerSocketChannel server =(ServerSocketChannel) key.channel();
                    SocketChannel channel = server.accept();
                    registerChannel(selector, channel,SelectionKey.OP_READ);//注册读事件
                    sayHello(channel);//对连接进行处理
                }
                //判断这个channel上是否有数据要读
                if (key.isReadable()) 
                {
                    readDataFromSocket(key);
                }
                //从selected set中移除这个key,因为它已经被处理过了
                it.remove();
            }
        }
    }
    // ----------------------------------------------------------
    /**
    * Register the given channel with the given selector for the given
    * operations of interest
    */
    protected void registerChannel(Selector selector,SelectableChannel channel, int ops) throws Exception
    {
        if (channel == null) 
        {
            return; // 可能会发生
        }
        // 设置通道为非阻塞
        channel.configureBlocking(false);
        // 将通道注册到选择器上
        channel.register(selector, ops);
    }
    // ----------------------------------------------------------
    // Use the same byte buffer for all channels. A single thread is
    // servicing all the channels, so no danger of concurrent acccess.
    //对所有的通道使用相同的缓冲区。单线程为所有的通道进行服务,所以并发访问没有风险
    private ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    /**
    * Sample data handler method for a channel with data ready to read.
    * 对于一个准备读入数据的通道的简单的数据处理方法
    * @param key
    *
    A SelectionKey object associated with a channel determined by
    the selector to be ready for reading. If the channel returns
    an EOF condition, it is closed here, which automatically
    invalidates the associated key. The selector will then
    de-register the channel on the next select call.
 
    一个选择器决定了和通道关联的SelectionKey object是准备读状态。如果通道返回EOF,通道将被关闭。
    并且会自动使相关的key失效,选择器然后会在下一次的select call时取消掉通道的注册
    */
    protected void readDataFromSocket(SelectionKey key) throws Exception 
    {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        int count;
        buffer.clear(); // 清空Buffer
        // Loop while data is available; channel is nonblocking
        //当可以读到数据时一直循环,通道为非阻塞
        while ((count = socketChannel.read(buffer)) > 0) 
        {
            buffer.flip(); // 将缓冲区置为可读
            // Send the data; don't assume it goes all at once
            //发送数据,不要期望能一次将数据发送完
            while (buffer.hasRemaining()) 
            {
                socketChannel.write(buffer);
            }
            // WARNING: the above loop is evil. Because
            // it's writing back to the same nonblocking
            // channel it read the data from, this code can
            // potentially spin in a busy loop. In real life
            // you'd do something more useful than this.
            //这里的循环是无意义的,具体按实际情况而定
            buffer.clear(); // Empty buffer
        }
        if (count < 0) 
        {
            // Close channel on EOF, invalidates the key
            //读取结束后关闭通道,使key失效
            socketChannel.close();
        }
    }
    // ----------------------------------------------------------
    /**
    * Spew a greeting to the incoming client connection.
    *
    * @param channel
    *
    The newly connected SocketChannel to say hello to.
    */
    private void sayHello(SocketChannel channel) throws Exception 
    {
        buffer.clear();
        buffer.put("Hi there!\r\n".getBytes());
        buffer.flip();
        channel.write(buffer);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI 绘画大热 ChatGPT 爆火,创意设计从业者准备好被取代了吗?
去年7 月,百度 AI 度晓晓用 1 秒钟复原《富春山居图》残卷,拨动了不少资本向该领域进军的心弦。8 月,一幅 AI 绘制的画作《太空歌剧院》(Théâtre D'opéra Spatial)拿到了美国科罗拉多州博览会美术比赛的一等奖,在绘画圈引起争议。11 月底,AI 绘画相关贴文开始走红中国社交媒体,并掀起了一场“全民 AI 绘画狂欢”。
IT胶囊
2023/02/20
5600
AI 绘画大热 ChatGPT 爆火,创意设计从业者准备好被取代了吗?
ChatGPT消灭全球3亿打工人!高盛重磅预测:25%岗位将被AI取代
---- 新智元报道   编辑:编辑部 【新智元导读】高盛又发报告称,全球3亿打工人恐被AI替代。从前,是给员工配电脑,现在,是给电脑配员工。 上周,OpenAI刚发了一篇让打工人瑟瑟发抖的论文,预言80%美国人的工作都会受到AI的影响。 短短5天后,高盛也紧随其后发布报告,再给我们一重暴击—— 根据预测,生成式AI会导致劳动力市场出现「重大混乱」,使全球3亿个工作岗位实现自动化,并且美国7%的工作岗位将被AI取代! 高盛表示,如果生成式AI真的能够兑现已有的能力,那这些情况完全有可能发生。 Cha
新智元
2023/03/29
4730
ChatGPT消灭全球3亿打工人!高盛重磅预测:25%岗位将被AI取代
这些人还是失业了?以ChatGPT为代表的人工智能正在改变职场
近来,各大科技公司在人工智能领域的竞争日趋激烈,在ChatGPT和新必应(New Bing)凭借开放式聊天和更复杂的互联网搜索版本进入公众视野后,当地时间3月21日,谷歌宣布放开聊天机器人Bard的部分访问权限,即日起美国和英国用户可通过bard.google.com网址进入候补名单并访问Bard。
IT胶囊
2023/03/27
7680
这些人还是失业了?以ChatGPT为代表的人工智能正在改变职场
麦肯锡重磅报告:AI对哪些行业冲击最大?
“AI时代”正式到来,“人工智能”更是被首次纳入企业裁员理由,而或许AI引爆的裁员浪潮才刚刚开始。
张俊红
2023/09/06
5850
麦肯锡重磅报告:AI对哪些行业冲击最大?
因AIGC失业的人已经出现,Adobe Firefly 能否在职场力挽狂澜?
AIGC即AI Generated Content,是指利用人工智能技术来生成内容,AIGC也被认为是继UGC、PGC之后的新型内容生产方式,AI绘画、AI写作等都属于AIGC的分支。
IT胶囊
2023/03/29
5400
因AIGC失业的人已经出现,Adobe Firefly 能否在职场力挽狂澜?
高盛预警!疯狂的 AIGC 将抢走全球 3 亿人饭碗,Open AI CEO : AI 还可能毁灭人类
作者 | 凌敏、核子可乐 但高盛同时也指出,AI 也可能创造出新的创新驱动型岗位。 1 高盛预测大语言模型可能威胁 3 亿工作岗位 日前,全球投资银行高盛发布研究称,ChatGPT 等 生成式人工智能 系统的最新突破,将给全球劳动力市场带来重大颠覆。高盛银行经济学家 Joseph Briggs 和 Devesh Kodnani 在文章中认为,全球就业市场仍将受到大语言模型的严重冲击,预计将有 3 亿个工作岗位被生成式 AI 取代。 其中,律师和行政人员将是最有可能被取代的岗位。相比之下,户外和体力
深度学习与Python
2023/04/01
3170
高盛预警!疯狂的 AIGC 将抢走全球 3 亿人饭碗,Open AI CEO : AI 还可能毁灭人类
诺奖经济学家称AI将取代STEM专业工作!Altman:人类无需工作,我给发钱
最近,2010年诺贝尔经济学奖得主,伦敦政治经济学院(LSE)教授Christopher Pissarides公开表态,在不远的未来,传统意义上的「数理化」学科知识和技能,都将会被AI取代。
新智元
2024/02/26
1480
诺奖经济学家称AI将取代STEM专业工作!Altman:人类无需工作,我给发钱
第一批被AI累死的人
一眼望过去,一排排的电脑屏幕上,都是类似的画面。也许是因为窗帘的遮光效果太好,略显昏暗的办公环境加上电脑屏幕上被放大的各种物体细节,颇为惊悚。
镁客网
2018/07/31
5530
第一批被AI累死的人
AI撕裂游戏圈:有人失业,有人狂欢
大数据文摘授权转载自深燃 作者:李秋涵 编辑:魏佳 是的,AI取代打工人的浪潮,已经来了,它最先发生在善于拥抱变化的游戏圈。 林语之前是一家游戏公司的UI(用户界面)设计师,去年年底被裁,今年找了三个月工作,发现一些游戏公司已经引入AI来做原画和UI了,招的人变少,于是她选择转行做了销售,因为她自认为,“我是比不过AI的”。 受冲击的不仅是UI设计师,一位自由画师告诉深燃,今年她在游戏行业的接单量,已经接近腰斩,“这一个月没有接到任何游戏的美宣图”。一位游戏公司在职画师提到,他们组的画师,最近已经缩减了三分
大数据文摘
2023/04/21
3200
AI撕裂游戏圈:有人失业,有人狂欢
IBM宣布将采用AI替代7800个工作岗位!
5月4日消息,随着以ChatGPT为代表的生成式AI技术的持续火爆,越来越多的企业开始引入AI来提升办公效率,甚至替代部分人类工作职位。近日,据外媒报道,当地时间周一,IBM公司宣布,将暂停招聘人工智能可以胜任的工作岗位,这表明AI技术正在改变人类的工作方式,人类员工将面临AI的竞争。
芯智讯
2023/05/09
2120
IBM宣布将采用AI替代7800个工作岗位!
AI代理部署激增327%:生成式AI认证(GAI)破解职场生存新法则
当人工智能不再是科幻电影中的遥远想象,而是真切地渗透进我们生活的每一处缝隙,一场悄无声息却又势不可挡的职场变革正汹涌袭来。最新预测显示,未来两年AI代理的部署将激增327%,这绝非简单的数字增长,而是意味着职场格局将被彻底重塑。曾经熟悉的工作模式、岗位需求、技能要求,都可能在这场浪潮中面目全非。那么,在这场即将到来的风暴中,我们究竟该如何自处?
IT胶囊
2025/05/07
1160
AI代理部署激增327%:生成式AI认证(GAI)破解职场生存新法则
Adobe 发布 AI 智能生成图像新工具,助力 Adobe 国际认证再添就业利器
3月22日早间消息,在周二于拉斯维加斯举行的Adobe Summit用户大会上,Adobe推出了生成式人工智能“副飞行员”Firefly,利用该公司的软件工具,使用简单的英语请求和人工智能软件创建原创内容,同时还解决了使用该技术时最棘手的版权和支付两个法律问题。
IT胶囊
2023/03/22
2860
职场干货分享:AI时代,打工人借助生成式人工智能认证(GAI认证)赋能自己?
当你在会议室里,看到同事用几分钟就生成一份惊艳全场的策划案;当你在深夜加班时,发现隔壁工位的新人用AI工具高效完成数据分析;当行业论坛上,专家们反复提及“不会AI的人将被淘汰”——这些场景是否让你隐隐不安?AI浪潮正以摧枯拉朽之势重塑职场规则,而真正的危机并非技术迭代本身,而是当变革来临时,你手中是否握有破局的关键筹码。
IT胶囊
2025/04/29
1040
职场干货分享:AI时代,打工人借助生成式人工智能认证(GAI认证)赋能自己?
生成式人工智能认证(GAI认证)如何推动就业市场的创新?
在科技浪潮汹涌澎湃的当下,生成式人工智能(Generative AI)宛如一颗璀璨的新星,照亮了众多行业的发展道路。而生成式人工智能认证(GAI认证)作为这一领域的重要支撑,正以其独特的魅力和强大的影响力,推动着就业市场的深刻变革与创新。
IT胶囊
2025/04/06
1210
生成式人工智能认证(GAI认证)如何推动就业市场的创新?
2025春招市场迎AI热潮:生成式人工智能(GAI)认证如何重构人才竞争力
随着科技的飞速发展,人工智能(AI)已逐渐渗透到我们生活的方方面面,从智能家居到自动驾驶,从智能客服到医疗诊断,AI的身影无处不在。而在这股AI浪潮中,生成式人工智能(Generative AI, Gen AI)作为一颗璀璨的新星,正以其独特的魅力和无限的潜力,引领着新一轮的技术革命。2025年的春季招聘市场,无疑成为了AI热潮的最佳见证者,而在这场人才争夺战中,生成式人工智能(GAI)认证正逐渐成为职场人士竞相追逐的新宠。
IT胶囊
2025/03/25
1490
2025春招市场迎AI热潮:生成式人工智能(GAI)认证如何重构人才竞争力
创意设计师,请不要相信考证无用论!
朋友向我吐槽:“自己30多岁了,感觉马上步入了中年危机。尤其郁闷的是,今年在公司的内部晋升也失败了。后来发现被提名的是一个刚工作两年的95后小朋友。”
IT胶囊
2023/04/10
4750
替代你的不是AI,而是会使用AI的人——GAI认证成为职场新宠
在当今这个日新月异的数字化时代,人工智能(AI)技术的迅猛发展正在深刻改变着我们的生活和工作方式。然而,在这场技术革命中,一个不可忽视的事实是:替代你的不是AI,而是那些熟练掌握并能够有效运用AI技术的人。面对这一趋势,如何让自己在职场中保持竞争力,成为了许多人关注的焦点。此时,生成式人工智能(GAI)认证的兴起,为职场人士提供了一个全新的提升自我、证明能力的途径。
IT胶囊
2025/03/27
710
替代你的不是AI,而是会使用AI的人——GAI认证成为职场新宠
跨年AI应用指南:有人获30万美元年薪新工作,GPTs可能彻底改变人类社会
奈飞在1999年推出DVD邮件订阅服务后,用了三年半的时间才拥有了100万用户;Airbnb用了两年半的时间吸引了100万用户;Facebook用了10个月时间取得这样的成绩;音乐流媒体服务Spotify只用了5个月就达到了这个受众规模,而Instagram在2010年用不到3个月的时间吸引到100万用户。
小腾资讯君
2024/01/23
1580
跨年AI应用指南:有人获30万美元年薪新工作,GPTs可能彻底改变人类社会
生成式人工智能的价值回归:重塑技术、社会与个体的发展轨迹
在数字化浪潮的席卷之下,生成式人工智能(Generative AI)正以前所未有的速度重塑人类社会的面貌。这项技术不仅被视为人工智能发展的新阶段,更被赋予了推动生产力跃升、加速社会形态变革的历史使命。生成式人工智能的价值回归,不仅体现在技术本身的革新与突破,更在于其对个体能力、社会结构以及伦理法律体系的深刻影响。这种价值回归,本质上是技术从工具属性向赋能属性的升华,是人类对技术应用的认知从“技术为我所用”到“我与技术共生”的哲学跃迁。
IT胶囊
2025/04/10
1150
生成式人工智能的价值回归:重塑技术、社会与个体的发展轨迹
4·26世界知识产权日,Adobe助力认知和解决知识产权的那些事
2023年是中国与世界知识产权组织(WIPO)合作50周年,在第23个世界知识产权日来临之际(每年4月26日定为世界知识产权日),让我们先来了解一下知识产权的相关知识吧!
IT胶囊
2023/04/24
3720
推荐阅读
AI 绘画大热 ChatGPT 爆火,创意设计从业者准备好被取代了吗?
5600
ChatGPT消灭全球3亿打工人!高盛重磅预测:25%岗位将被AI取代
4730
这些人还是失业了?以ChatGPT为代表的人工智能正在改变职场
7680
麦肯锡重磅报告:AI对哪些行业冲击最大?
5850
因AIGC失业的人已经出现,Adobe Firefly 能否在职场力挽狂澜?
5400
高盛预警!疯狂的 AIGC 将抢走全球 3 亿人饭碗,Open AI CEO : AI 还可能毁灭人类
3170
诺奖经济学家称AI将取代STEM专业工作!Altman:人类无需工作,我给发钱
1480
第一批被AI累死的人
5530
AI撕裂游戏圈:有人失业,有人狂欢
3200
IBM宣布将采用AI替代7800个工作岗位!
2120
AI代理部署激增327%:生成式AI认证(GAI)破解职场生存新法则
1160
Adobe 发布 AI 智能生成图像新工具,助力 Adobe 国际认证再添就业利器
2860
职场干货分享:AI时代,打工人借助生成式人工智能认证(GAI认证)赋能自己?
1040
生成式人工智能认证(GAI认证)如何推动就业市场的创新?
1210
2025春招市场迎AI热潮:生成式人工智能(GAI)认证如何重构人才竞争力
1490
创意设计师,请不要相信考证无用论!
4750
替代你的不是AI,而是会使用AI的人——GAI认证成为职场新宠
710
跨年AI应用指南:有人获30万美元年薪新工作,GPTs可能彻底改变人类社会
1580
生成式人工智能的价值回归:重塑技术、社会与个体的发展轨迹
1150
4·26世界知识产权日,Adobe助力认知和解决知识产权的那些事
3720
相关推荐
AI 绘画大热 ChatGPT 爆火,创意设计从业者准备好被取代了吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验