Java NIO深入分析
短信预约 -IT技能 免费直播动态提醒
以下我们系统通过原理,过程等方便给大家深入的简介了Java NIO的函数机制以及用法等,学习下吧。
前言
本篇主要讲解Java中的IO机制
分为两块:
第一块讲解多线程下的IO机制
第二块讲解如何在IO机制下优化CPU资源的浪费(New IO)
Echo服务器
单线程下的socket机制就不用我介绍了,不懂得可以去查阅下资料
那么多线程下,如果进行套接字的使用呢?
我们使用最简单的echo服务器来帮助大家理解
首先,来看下多线程下服务端和客户端的工作流程图:
可以看到,多个客户端同时向服务端发送请求
服务端做出的措施是开启多个线程来匹配相对应的客户端
并且每个线程去独自完成他们的客户端请求
原理讲完了我们来看下是如何实现的
在这里我写了一个简单的服务器
用到了线程池的技术来创建线程(具体代码作用我已经加了注释):
public class MyServer { private static ExecutorService executorService = Executors.newCachedThreadPool(); //创建一个线程池 private static class HandleMsg implements Runnable{ //一旦有新的客户端请求,创建这个线程进行处理 Socket client; //创建一个客户端 public HandleMsg(Socket client){ //构造传参绑定 this.client = client; } @Override public void run() { BufferedReader bufferedReader = null; //创建字符缓存输入流 PrintWriter printWriter = null; //创建字符写入流 try { bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream())); //获取客户端的输入流 printWriter = new PrintWriter(client.getOutputStream(),true); //获取客户端的输出流,true是随时刷新 String inputLine = null; long a = System.currentTimeMillis(); while ((inputLine = bufferedReader.readLine())!=null){ printWriter.println(inputLine); } long b = System.currentTimeMillis(); System.out.println("此线程花费了:"+(b-a)+"秒!"); } catch (IOException e) { e.printStackTrace(); }finally { try { bufferedReader.close(); printWriter.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws IOException { //服务端的主线程是用来循环监听客户端请求 ServerSocket server = new ServerSocket(8686); //创建一个服务端且端口为8686 Socket client = null; while (true){ //循环监听 client = server.accept(); //服务端监听到一个客户端请求 System.out.println(client.getRemoteSocketAddress()+"地址的客户端连接成功!"); executorService.submit(new HandleMsg(client)); //将该客户端请求通过线程池放入HandlMsg线程中进行处理 } }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Java NIO深入分析
下载Word文档到电脑,方便收藏和打印~
下载Word文档
相关文章
- Ruby加密技术:如何改变数据存储方式?
- 在 Java 中,arraycopy 方法的具体用法是什么?(java中arraycopy的用法是什么)
- 如何巧妙利用 Java Map 来实现缓存功能?(如何利用Java Map实现缓存功能)
- Java 中 zlib 库的使用技巧有哪些?(Java中zlib库的使用技巧)
- 在 Java 中如何将 Object 转换为自定义类型?(java怎么将Object转换为自定义类型)
- Java多线程编程中常见错误有哪些?如何解决?(Java多线程编程常见错误及解决方法)
- 在 eclipse 中如何进行 java 代码规范设置?(eclipse下java代码规范设置)
- 如何在 Java 分布式架构中避免错误?(Java分布式架构如何避免错误)
- 如何利用 Java 多线程来进行数据统计?(怎么用java多线程统计数据)
- 掌握Ruby加密与解密:确保数据安全的关键步骤
猜你喜欢
Java NIO深入分析
以下我们系统通过原理,过程等方便给大家深入的简介了Java NIO的函数机制以及用法等,学习下吧。前言本篇主要讲解Java中的IO机制分为两块:第一块讲解多线程下的IO机制第二块讲解如何在IO机制下优化CPU资源的浪费(New IO)Ech
2023-05-30
深入浅析Java NIO中的IO模型
这期内容当中小编将会给大家带来有关深入浅析Java NIO中的IO模型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一.什么是同步?什么是异步 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也
2023-05-31
Java输入输出IO、NIO和AIO对比分析
这篇文章主要讲解了“Java输入输出IO、NIO和AIO对比分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java输入输出IO、NIO和AIO对比分析”吧!1、Java I/O发展史
2023-07-06
Java中NIO的示例分析
这篇文章主要介绍了Java中NIO的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Java思维导图二、I/O模型I/O模型的本质是用什么样的通道进行数据的发送和接
2023-06-29
Java Autowired注解深入分析
@Autowired注解是Spring中非常重要且常见的,接下来就简要的介绍一下它的用法。@Autowired默认是通过set方法,按照类型自动装配JavaBean,set方法可省略不写,它主要是修饰在成员变量上
2023-01-31
Java 输入输出 IO NIO AIO三兄弟对比分析对比分析
这篇文章主要为大家介绍了Java 输入输出 IO NIO AIO三兄弟对比分析对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-15
2024-04-02
Java内存模型的深入分析
曾经,计算机的世界远没有现在复杂,那时候的cpu只有单核,我们写的程序也只会在单核上按代码顺序依次执行,根本不用考虑太多。
2024-04-02
2024-04-02
JAVA提高第十篇 ArrayList深入分析
前面一章节,我们介绍了集合的类图,那么本节将学习Collection 接口中最常用的子类ArrayList类,本章分为下面几部分讲解(说明本章采用的JDK1.6源码进行分析,因为个人认为虽然JDK1.8进行了部分改动,但万变不离其宗,仍然采
2023-05-30
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
本文转载 https://www.javadoop.com本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看https://github.com/h3pl/Java-Tutorial喜欢的话麻烦点
2023-06-02
2024-04-02
2024-04-02
2024-04-02
2024-04-02
2024-04-02
2024-04-02
SpringAOP源码深入分析
这篇文章主要介绍了SpringAOP源码,AOP(AspectOrientProgramming),直译过来就是面向切面编程,AOP是一种编程思想,是面向对象编程(OOP)的一种补充
2023-01-03
ReactFiber源码深入分析
Fiber可以理解为一个执行单元,每次执行完一个执行单元,ReactFiber就会检查还剩多少时间,如果没有时间则将控制权让出去,然后由浏览器执行渲染操作,这篇文章主要介绍了ReactFiber架构原理剖析,需要的朋友可以参考下
2022-11-13