java阻塞和非阻塞io的区别


Java IO操作是开发者非常常用的一个功能,其中阻塞与非阻塞IO是关键因素。下面我们将介绍阻塞IO和非阻塞IO的区别。

阻塞IO

当程序运行遇到IO操作时,程序会阻塞,一直等到数据准备好并且成功实现数据传输后再继续运行,阻塞IO的典型例子是服务器等待客户端连接。这种模式阻塞很强,因为是一直等待直到数据到达,所以效率很低,产生的线程也很多。

//阻塞IO的轮询ServerSocket serverSocket = new ServerSocket(port);while (true) {Socket socket = serverSocket.accept(); //等待客户端连接InputStream inputStream = socket.getInputStream(); //等待输入//处理数据}

非阻塞IO

相比阻塞IO,非阻塞IO则是在IO操作时程序不会被阻塞,它会继续运行,如果数据没有准备好,程序会直接返回,非阻塞IO会请求系统返回结果,“我需要读一个数据,但我不想在此等待,有缓冲区有就读,没就先不读。” 这种方式要复杂许多,我们需要循环或则回调获取IO节点的状态,例如Java的NIO。

//非阻塞IO的轮询ServerSocketChannel serverChannel = ServerSocketChannel.open();Selector selector = Selector.open();serverChannel.configureBlocking(false);serverChannel.socket().bind(new InetSocketAddress(port));serverChannel.register(selector, SelectionKey.OP_ACCEPT);while (true) {int readyChannels = selector.select(); //查询是否有连接if (readyChannels < 1) continue;Set<SelectionKey> selectedKeys = selector.selectedKeys(); //获取有数据的连接Iterator<SelectionKey> keyIterator = selectedKeys.iterator();while (keyIterator.hasNext()) {SelectionKey key = keyIterator.next();if (key.isAcceptable()) {SocketChannel socketChannel = serverChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {ByteBuffer buf = ByteBuffer.allocate(1024);SocketChannel channel = (SocketChannel) key.channel();channel.read(buf); //读入数据//处理数据}keyIterator.remove();}}

总的来说,非阻塞IO适合比较忙的服务器,能非常好的处理系统资源问题,阻塞IO则适合单线程处理高并发的情景。


上一篇:css提示初学者

下一篇:Java隐写和分析代码


Copyright © 2002-2019 测速网 https://www.inhv.cn/ 皖ICP备2023010105号 城市 地区 街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!
热门搜索