JAVA成长日记之基于JDK8聊聊NIO

本文介绍了JAVA从1.4版本开始引入的NIO(Non-blocking IO)特性,对比了BIO(Blocking IO)模型的优缺点,并详细探讨了NIO的三大核心组成部分:Buffer、Channel和Selector。Buffer提供了面向缓冲区的处理方式,Channel实现了数据的双向传输,Selector则允许单线程处理多个Channel的事件,提高了系统资源利用率。通过Selector的SelectionKey可以获取已就绪的通道,实现高效的IO操作。
摘要由CSDN通过智能技术生成

JAVA在1.4之前仅支持BIO,在1.4之后新增了对NIO的支持。具体的方法在让rt.jar下的Java.nio 目录中。

 

BIO

在聊聊NIO之前,肯定先需要了解什么是NIO。NIO即non-blocking IO 同步非阻塞IO,在JAVA中NIO也可以称为 new IO。NIO 也是 IO多路复用的基础,下一篇我们就会去了解一下什么是 IO多路复用。 IO多路复用传送门

在了解NIO之前,我们需要去了解一下BIO blocking IO

public class BIO {

    public static void main(String[] args) throws IOException {

        ExecutorService executor = Executors.newFixedThreadPool(100);//线程池

        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress(8888));
        while (!Thread.currentThread().isInterrupted()) {//主线程死循环等待新连接到来
            Socket socket = serverSocket.accept();
            executor.submit(new ConnectIOnHandler(socket));//为新的连接创建新的线程
        }
    }
    static class ConnectIOnHandler extends Thread{
        private Socket socket;
        public ConnectIOnHandler(Socket socket){
            this.socket = socket;
        }
        public void run(){
            while(!Thread.currentThread().isInterrupted()&&!socket.isClosed()){
                //死循环处理读写事件
                try{
                    InputStream inputStream = socket.getInputStream();//读取数据
                    inputStream.read();
                    if(inputStream!=null){
                        //处理数据
                        OutputStream outputStream = socket.getOutputStream();
                        outputStream.write("xxx".getBytes(StandardCharsets.UTF_8));
                        //写数据
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        }
    }
}

BIO模型的优点

1. 就是利用CPU的多核,开启多线程更合理的利用CPU资源。且现在的多线程一般都使用线程池,可以让线程的创建和回收成本相对较低。

2. 在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O并且编程模型简单,也不用过多考虑系统的过载、限流等问题。

3. 线程池本身就是一个天然的漏斗&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值