zoukankan      html  css  js  c++  java
  • java 中AIO,BIO,NIO的区别(茅塞顿开)

    看到知乎上一篇回答,解决了疑惑:https://www.zhihu.com/question/56673416 第三位作者的回答...原谅我没有登录知乎,不然一定给他留赞.

    也可以参考:https://blog.csdn.net/baixiaoshi/article/details/48708347

                      https://blog.csdn.net/zccracker/article/details/38686339

    很多人的解释都是扯在一起的,反而让人觉得晕乎乎的,或者他们自己也没真正的搞懂....

    这个模型的前提是 clint端发请求,,然后分析时就没clint啥事了,有些人说客户端阻塞...所有模型中Clint不都是阻塞的么,这是http协议呀,必须有返回!!主要是针对server进行模型分析.

    阻塞和非阻塞区分:请求id的线程是否是阻塞的状态

    同步异步的区分:数据是去内核buffer还是进程buffer去取以及是否是通知进程还是进程自己去查询.(这里涉及到用户线程和内核线程的知识.)

    结合java

    bio 同步阻塞:

           ServerSocket serverSocket = new ServerSocket(10101);
            while (true){
                //获取一个套接字(阻塞)  
                final Socket socket = serverSocket.accept();
                //开个线程,处理连接的clint socket...
    new }

      套用上面的区别,,此时接受客户端连接的线程(请求线程),一直处于阻塞状态,等待客户端连接(阻塞),每个clint 连接后分配一个线程(用户线程(进程线程))(同步)------>同步阻塞

    nio同步非阻塞:

     SocketChannel serverChannel = SocketChannel.open();
            selector = Selector.open();
            serverChannel.socket().bind(new InetSocketAddress(8080));
            serverChannel.configureBlocking(false);
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);
    
            Set<SelectionKey> sleSet = selector.selectedKeys();
            while (true) {
                int count = selector.select();
                Iterator<SelectionKey> iterator = sleSet.iterator();
                while (iterator.hasNext()) {
    
                    SelectionKey selectionKey= iterator.next();
                    Buffer buffer=ByteBuffer.allocate(1024);
                    if(selectionKey.isAcceptable()){
                        ServerSocketChannel socketChannel=(ServerSocketChannel) selectionKey.channel();
                     //处理逻辑,开线程
    
                    }else if(selectionKey.isReadable()){
    
                    }else if (selectionKey.isWritable()){
    
                    }
                    iterator.remove();
                }
    
            
            }
    

      分析;  selector.selectedKeys() 一直轮询着,,如果事件处理很费时间,依旧是阻塞的,,,也需要要开线程去异步处理,保证请求的主线程不被阻塞,达到非阻塞目的,所以它可以被设计成阻塞的,也可以被设计成非阻塞的,,他也是基于进程线程的读写,所以属于同步---->综上可得到他是同步非阻塞

    aio异步非阻塞:

           封装的比较狠,,展示不出效果..基于事件的回调,,future/callback,,,大概的过程是操作系统内核线程处理完,通知进程线程拿到结果,期间进程线程可以做其他的事情,这样做的好处是充分利用操作系统的并发能力.

    ///以上内容只为加深下理解...感觉解释得通

  • 相关阅读:
    牛人对IC验证的独特理解(转载)
    soc验证扫盲(转载)
    .vimrc
    matchit匹配
    格式化verilog/systemverilog代码插件
    gvim plugin管理
    .alias
    .cshrc
    get_result --perl
    run_regress --perl
  • 原文地址:https://www.cnblogs.com/jinjian91/p/9069901.html
Copyright © 2011-2022 走看看