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隐写和分析代码
一个草根站长在网络推广中遇到的
新站上线后应该做哪些有利于seo
新站结合熊掌号的实际操作 实现
一个网管8年来运营网站的辛酸经
针对discuz系统网站设置301重定
干货:企业产品网站三个月关键词
浅谈网站遇到问题时的解决办法及
详解HTTPS改造全过程
网站被K之后快速恢复技巧
HTTPS协议藏着巨大的秘密