十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
以下我们系统通过原理,过程等方便给大家深入的简介了Java NIO的函数机制以及用法等,学习下吧。
创新互联科技有限公司专业互联网基础服务商,为您提供成都温江机房,高防主机,成都IDC机房托管,成都主机托管等互联网服务。前言
本篇主要讲解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线程中进行处理 } } }