当前位置: 首页 > 后端技术 > Java

面试官:什么是BIO、NIO、AIO,它们有什么区别?

时间:2023-04-01 16:36:16 Java

您好!大家好,我是小七,一个爱分享的程序员。小七打算在轻松幽默的对话中分享一些技术。如果你觉得通过小七的文章有所收获,那就给小七点赞吧。持续更新,可以微信搜索【小七JAVA专访】第一时间阅读,回复【资讯】我已经为你准备好了福利!回复【项目】有一些项目源码我给大家准备好了。1.我是按照上次的序来的。上次觉得公司氛围不好(其实是因为女的少),所以还是不想去了。当一家大公司需要我时,我会再去一次。今天下着大雨,乡下的空气格外清新。呼吸让我感到非常放松和自在。这么好的天气,不买点熟食,再买一瓶牛栏山酒回家喝,实在是太可惜了。说干就干,披上雨披去镇上买两两牛肉。走到村口,就看到邻居家的大梅和小梅。也不知道他们去哪里吃的,还吃了一整块巧克力。我:“你们两个去哪儿吃的?巧克力都吃光了。”大梅:吃什么?我在厂里下班回来,在家做饭。我:“我没吃,你怎么弄来一套巧克力的?”小美:“刚才我转身太用力,扔了出去。”我:“你们两个也有才……路这么烂,我就不去镇上买熟食了,我们回家吧,万一熟食吃不下,我就吃个全身都是巧克力。”回到家,躺在沙发上打开电视,下雨天看电视也很惬意。突然电话响了。我:“喂。”对面:“喂,请问是小七吗?”我:“是我,你呢?”对面:“我是XXX公司的。我看到hr把你的简历推给我了。我感觉很好。你什么时候方便来现场面试。”我:“现在不方便现场面试。”对面:“好的,你现在方便吗?我们现在进行在线面试。”我:“好”。2.面试面试官:“能介绍一下网络IO模型吗?”我:“网络IO模型有BIO、NIO、AIO。”面试官:“它们分别代表什么,有什么区别吗?”BIO:同步阻塞IO。NIO:同步非阻塞IO。AIO:异步非阻塞IO。面试官:“为什么BIO是同步阻塞IO,他阻塞和谁有关系whom?”。首先,在网络编程中,客户端向服务器端发送消息大致分为两步。1.发起连接。2.发送数据。在BIO中,需要为每个连接分配一个线程来执行。如果客户端A连接到服务器但还没有发送消息,此时客户端B向服务器发送连接请求,此时服务器没有办法处理客户端B请求的连接。因为一个线程在处理完一个客户端连接后会阻塞,等待处理客户端发送过来的数据。只有处理完本客户端的数据后,才能处理其他客户端的连接请求。面试官:“那你只有一个线程的时候,我做多个线程就好了,如果你来一个请求连接,我就做一个线程。”我:“那如果同时有10000个连接请求过来,那你开10000个线程,服务器就崩溃了。”面试官:“那我建一个线程池,最大线程数最多500个?”。我:“如果有500个线程只请求连接,不发送数据,那你的线程池就是也没用。如果这500个请求都连上了,还没有发送数据,那么线程池中的500个线程就没有办法处理其他请求了,也就没用了。面试官:“那我该怎么办?”。我:“别慌,哥有办法,可以用NIO非阻塞同步,这样就不需要很多线程,一个线程可以处理很多请求连接和请求数据。”面试官:《NIO如何实现一个线程处理多个连接请求和多个请求数据呢?》。我:“NIO会把获取到的请求连接放到一个数组中,然后遍历数据,看这些连接有没有发送过数据。”采访者:“这是一个伟大的举动。”我:“那必须放弃。”面试官:“但是有个问题,如果B和C只是连接上了,还没有发送过数据,那么每次都要检查他们有没有发送过数据,就有点多余了。现在,我知道B是不是可以再遍历他C一定已经发送了数据?”。我:“那你让ClientB和ClientC发数据的时候给你打电话,然后你只遍历一下。”面试官:“他们也不能叫我,你可以想别的办法。”我:“可以引入epoll,从JDK1.5开始引入epoll,通过事件响应来优化NIO,其原理是将客户端发送的每一个连接,每一个数据都看成一个事件,每一次事件发生,它会注册到服务器上去一个集合,然后客户端只需要遍历这个集合。面试官:“那AIO的特点是什么?”我:“AIO是异步非阻塞的,它使用不同的线程来处理,他通过回调通知服务端程序开始线程处理,适合长连接场景。”面试官:“小伙子不错,我什么时候可以回京入职?”我:“呃等等,现在家里下雨太大了,很容易沾满巧克力。”面试官:“好,那你来北京一定要来我们公司上班。”我:“嗯……我不能答应你,万一有其他好的公司给我打电话。”面试官:“行吧,条件可以商量”我:“我考虑一下。”3.总结网络编程模型这里就不整理了,后面会继续更新文章,推荐收藏。文中涉及的命令必须像我一样多敲几次。只有在敲打的过程中,才能发现自己是否真正掌握了命令。如果觉得我的文章还不错,请点个赞。另外大家可以微信搜索【小七JAVA面试】阅读更多好文,获取我为大家准备的资料。回复【项目】还有更多开源项目,持续更新分享给大家。