您现在的位置是:主页 > news > 网站栏目模块/补肾壮阳吃什么药效果好
网站栏目模块/补肾壮阳吃什么药效果好
admin2025/6/17 9:12:55【news】
简介网站栏目模块,补肾壮阳吃什么药效果好,昆明企业做网站,郑州市热点新闻I/O模型简介 文章目录I/O模型简介前言一、BIO二、NIO三、BIO与NIO的比较前言 在Linux中有五种I/O模型:阻塞IO、非阻塞IO、IO复用、信号驱动IO、异步IO,在Java的网络编程中支持BIO(同步阻塞IO)、NIO(同步非阻塞IO)、AIO(异步非阻塞IO),这是我…
I/O模型简介
文章目录
- I/O模型简介
- 前言
- 一、BIO
- 二、NIO
- 三、BIO与NIO的比较
前言
在Linux中有五种I/O模型:阻塞IO、非阻塞IO、IO复用、信号驱动IO、异步IO,在Java的网络编程中支持BIO(同步阻塞IO)、NIO(同步非阻塞IO)、AIO(异步非阻塞IO),这是我们学习通讯框架最基础的知识。ajax应该都用过,同步异步的概念就不需要再讲解了,阻塞非阻塞IO线程是否阻塞等待,多线程锁那种阻塞。本文针对NIO做了简单的讲解。
一、BIO
BIO(Blocking IO) 阻塞IO,就是同步IO,发送出去IO请求后一直等待请求返回结果后才能继续网下面执行。BIO是不存在缓冲区的,下面是我们使用BIO通讯的demo:
//创建ServiceSocketServerSocket serverSocket = new ServerSocket();//绑定端口号serverSocket.bind(new InetSocketAddress(8080));//等待客户端请求Socket socket = serverSocket.accept();int read = socket.getInputStream().read(bytes);if(read > 0){System.out.print(new String(bytes));}
没有读取到服务端数据的时候将会一直阻塞在等待客户端请求的阶段。如果我们需要一直跟服务器交流可能需要放到循环中:
//创建ServiceSocketServerSocket serverSocket = new ServerSocket();//绑定端口号serverSocket.bind(new InetSocketAddress(8080));//等待客户端请求while (true) {Socket socket = serverSocket.accept();int read = socket.getInputStream().read(bytes);if (read > 0) {System.out.print(new String(bytes));}}
这就导致了一个问题我们的程序是单线程的,无法进行多个请求。我们如果创建一个线程池去把请求数据的代码放到线程中(如下图),这样如果请求多了会导致服务器卡死。是非常消耗CPU资源的。
二、NIO
NIO(Non-Blocking IO) 非阻塞IO,jdk1.4之后提供的一种新的IO,非阻塞就类似于异步执行,发送完请求后先执行后面的操作,同时监听着请求的回调。
NIO是面向缓冲区编程的。数据读取到一个缓冲区中,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞式的高伸缩性网络。
NIO有三大核心组成:
Channel: 就是每次请求的通道,类似于流,但是可以双向读写操作。
Selector: 就是存放所有Channel的集合。
Buffer: 缓冲区,数据缓存,有消息后放到缓冲区,读取的时候在缓冲区中读取。
针对上面阻塞IO频繁创建线程导致CPU消耗过大问题,我们可以使用单线程把所有的请求放到一个集合中遍历集合就可以使用一个线程同时还能多个请求并行(此处使用的是NIO非阻塞IO,不用每次请求后必须等到有回复,我们一直在一个循环中等待消息过来打印)。
//创建ServiceSocketServerSocketChannel serverSocketChannel = ServerSocketChannel.open();//绑定端口号serverSocketChannel.bind(new InetSocketAddress(8080));//设置为非阻塞式,使用的非阻塞IOserverSocketChannel.configureBlocking(false);//把所有的客户端请求放到一个集合中List<SocketChannel> socketChannels = new ArrayList();while (true) {SocketChannel socketChannel = serverSocketChannel.accept();if(socketChannel != null){socketChannel.configureBlocking(false);//创建完成加入集合中socketChannels.add(socketChannel);}//遍历集合查看请求是否接受到消息for(SocketChannel channel : socketChannels){int i = channel.read(byteBuffer); //非阻塞IO这里不用等待的,这次查询没有那就下次遍历if(i>0){buffer.flip()byte[] bytes = Arrays.copyOf(byteBuffer.array(),byteBuffer.limit());System.out.print(new String(bytes));}}}
这样就减少了CPU消耗,同时还能多路请求一起执行。当然这只是个简单的Demo,实际中是使用的事件注册和监听。
三、BIO与NIO的比较
- BIO为阻塞IO,NIO为非阻塞IO。
- BIO 以流的方式处理数据, NIO 以缓冲区的方式处理数据,NIO效率要比BIO高很多。
- BIO一次只能监听一个客户端,而NIO采用了选择器可以监听多个通道,所以NIO可以监听多个客户端。
文章内容来源:
蚂蚁课堂