Java:什么是NIO?什么是BIO?NIO 和 BIO 有什么区别?

NIO(New IO)和BIO(Blocking IO)的区别 例如,传统的Web服务器在处理HTTP请求时,如果采用BIO模型,那么每个客户端连接都需要一个独立的线程来处理,当并发连接数增加时,服务器的线程资源会迅速耗尽,性能会急剧下降。即从多线程模型中由一个线程来监听连接事件和数据读写事件,拆分为一个线程监听连接事件,线程池的多个线程监听已经建立连接的套接字的数据读写事件。选择器是NIO中用于监听多个通道的事件的机制。它可以同时监听多个通道(Channel)的I/O事件,如读事件、写事件、连接事件等,使得一个单独的线程可以管理多个通道,进一步提高了系统的并发性。 阅读详情

一、什么是NIO

1.概念

NIO是java1.4中引入的,被称为new I/O,也有说是non-blocking I/O,NIO被成为同步非阻塞的IO。

image.png

2.跟BIO流的区别

  1. BIO是面向流的,NIO是面向块(缓冲区)的。

  2. BIO的流都是同步阻塞的,而NIO是同步非阻塞的。

  3. NIO会等待数据全部传输过来再让线程处理,BIO是直接让线程等待。

  4. NIO有选择器,而BIO没有。

  5. NIO是采用管道和缓存区的形式来处理数据的,而BIO是采用输入输出流来处理的。

  6. NIO是可以双向的,BIO只能够单向。

image

 

二、NIO常用组件Channel和Buffer的使用

1.代码

这里以文件复制为例

public class test {
    public static void main(String[] args){
        try{
            //存在的照片
            File inFile=new File("C:\\Users\\Administrator\\Desktop\\study.PNG");
            //复制后要存放照片的地址
            File outFile=new File("C:\\Users\\Administrator\\Desktop\\study1.PNG");
            //打开流
            FileInputStream fileInputStream=new FileInputStream(inFile);
            FileOutputStream fileOutputStream=new FileOutputStream(outFile);
            /**
             * RandomAccessFile accessFile=new RandomAccessFile(inFile,"wr");
             *  FileChannel inFileChannel=accessFile.getChannel();
             *  和下面两行代码是一样的,都是可以拿到FileChannel
             */
            //获取Channel
            FileChannel inFileChannel=fileInputStream.getChannel();
            FileChannel outFileChannel=fileOutputStream.getChannel();
           //创建buffer
            ByteBuffer buffer=ByteBuffer.allocate(1024*1024);
            //读取到buffer中
            while (inFileChannel.read(buffer)!=-1){
                //翻转一下,就可以读取到全部数据了
                buffer.flip();
                outFileChannel.write(buffer);
                //读取完后要clear
                buffer.clear();
            }
            //关闭
            inFileChannel.close();
            outFileChannel.close();
            fileInputStream.close();
            fileOutputStream.close();
        }catch (Exception e){}

    }
}

我的桌面上的确多了一张一模一样的图片

2.解释

使用NIO的话,需要注意几个步骤:

  1. 打开流

  2. 获取通道

  3. 创建Buffer

  4. 切换到读模式 buffer.flip()

  5. 切换到写模式 buffer.clear(); 其实这里也看不出来它是怎么使用缓冲区的,上面这段代码中的while循环的作用和下面的代码是一样的


while ((i=fileInputStream.read())!=-1){
                fileOutputStream.write(i);
          }

image.png

 

让我们赶紧开始NIO的编程

三、BIO和NIO的区别

学习了Channel和Buffer的使用,我们就可以正式进入NIO的开发了

代码

NIO

NIO服务端:只是接受客户端发送过来的数据,然后打印在控制台


/**
 * NIO
 * @author xuxiaobai
 */
public class NIOTest {
    private final static int port = 8080;

    public static void main(String[] args) throws IOException {
        //启动服务端
        TCPServer();
    } 
    /**
     * TCP服务端
     * 接受TCP
     *
     * @throws IOException
     */
    public static void TCPServer() throws IOException {
        //创建服务端多路复用选择器
        Selector selector = Selector.open();
        //创建服务端SocketChannel
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //定义地址
        InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);
        //绑定地址
        serverSocketChannel.bind(inetSocketAddress);
        System.out.println("绑定成功:" + inetSocketAddress);
        //设置为非阻塞
        serverSocketChannel.configureBlocking(false);
        //注册服务端选择端,只接受accept事件
        serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        while (true) {
            //加上延时,什么原理我忘记了,只知道是为了防止死锁
            selector.select(500);
            //遍历服务端选择器的事件
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while (iterator.hasNext()) {
                SelectionKey next = iterator.next();
                if (!next.isValid()) {
                    //该key无效直接跳过
                    continue;
                }
                //注意
                if (next.isAcceptable()) {
                    //1\. accept事件
                    //接收到accept事件,拿到channel,这个是服务端SocketChannel
                    ServerSocketChannel channel = (ServerSocketChannel) next.channel();
                    //accept得到连接客户端的channel
                    SocketChannel accept = channel.accept();
                    accept.configureBlocking(false);
                    //注册write事件
                    accept.register(selector, SelectionKey.OP_READ);
                    iterator.remove();
                } else if (next.isReadable()) {
                    //2\. read事件
                    //开启一个新的线程
                    Thread thread = new Thread(() -> {
                        SocketChannel channel = (SocketChannel) next.channel();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                        byteBuffer.clear();
                        try {
                            channel.read(byteBuffer);
                            //开始处理数据
                            byteBuffer.flip();
                            byte[] bytes = new byte[byteBuffer.remaining()];
                            byteBuffer.get(bytes);
                            String x = new String(bytes);
                            if(x.equals("")){
                                //老是会莫名其妙地打印一些空行,打个补丁
                                return;
                            }
                            System.out.println(x);
                            if ("exit".equals(x)) {
                                //关闭通道
                                try {
                                    channel.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                next.cancel();
                            }
                        } catch (IOException e) {
                            //出现异常的处理
                            e.printStackTrace();
                            try {
                                channel.close();
                            } catch (IOException ioe) {
                                ioe.printStackTrace();
                            }
                            next.cancel();
                        }

                    });
                    iterator.remove();
                    thread.start();
                }
            }
        }
    }
}

BIO

BIO服务端:接受客户端的数据,然后打印在控制台

BIO客户端:向服务端发送数据。NIO的测试中也使用这个客户端进行测试


/**
 * BIO
 * @author xuxiaobai
 */
public class BIOTest {
    private final static int port = 8080;

    public static void main(String[] args) throws IOException {
        TCPClient();
//        TCPServer();
    }

    /**
     * TCP客户端
     * 发送TCP
     * @throws IOException
     */
    private static void TCPClient() throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        //定义地址
        InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);
        //连接
        socketChannel.connect(inetSocketAddress);
        System.out.println("连接成功:"+inetSocketAddress);
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String next = scanner.next();
            //直接包装一个buffer
            ByteBuffer wrap = ByteBuffer.wrap(next.getBytes());
            //写入
            socketChannel.write(wrap);
            if ("exit".equals(next)) {
                //等于exit时关闭channel
                socketChannel.close();
                break;
            }
        }
    }

    /**
     * TCP服务端
     * 接受TCP
     * @throws IOException
     */
    private static void TCPServer() throws IOException {
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        //定义地址
        InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);
        //绑定
        serverSocketChannel.bind(inetSocketAddress);
        System.out.println("绑定成功:"+inetSocketAddress);
        while (true) {
            //接受连接
            SocketChannel accept = serverSocketChannel.accept();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //定义一个缓冲区,读出来的数据超出缓冲区的大小时会被丢弃
                    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                    while (true) {
                        try {
                            //每次使用前都要清空,但这里没有真的区clear数据,只是移动了buffer里面的下标
                            byteBuffer.clear();
                            //读取数据到缓冲区
                            accept.read(byteBuffer);
                            //每次读取数据前都要flip一下,这里都移动下标
                            byteBuffer.flip();
                            byte[] bytes = new byte[byteBuffer.remaining()];
                            //获取数据
                            byteBuffer.get(bytes);
                            String x = new String(bytes);
                            System.out.println(x);
                            if (x.equals("exit")) {
                                //当读出来的数据等于exit时退出
                                accept.close();
                                break;
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
            //启动该线程
        }
    }
}

image.png

 

搞完了代码,让我们来看看代码的演示效果————从客户端发送数据到服务端,下面展示一下效果:

先后启动BIO的TCPServer和TCPClient方法;

TCPClient:

image

 

TCPServer:

image

 

步骤

image

 

画了个图来表示,这是关于selector的配置流程,在循环中根据不同key值所进行的操作,跟上面文件复制的例子差不多了,只不过这里的Channel是通过 key.channel()获得的。

image

 

差别

我们来看看一下BIO和NIO的差别。

BIO

我们用IDEA的debug启动BIO的服务端,然后在启动多个客户端。

image

 

我这里启动了三个客户端,可以看到有三个线程已经创建好了,然而我这时还没有发送数据到服务端。

NIO

我们用IDEA的debug启动NIO的服务端,然后在启动多个BIO客户端。

image

 

这里启动了多个客户端,服务器上没有多余的几个线程。

修改BIO的TCPClient方法


private static void TCPClient() throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        //定义地址
        InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost(), port);
        //连接
        socketChannel.connect(inetSocketAddress);
        System.out.println("连接成功:" + inetSocketAddress);
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String next = scanner.next();
            //直接包装一个buffer
//            ByteBuffer wrap = ByteBuffer.wrap(next.getBytes());
            //写入
            while (true) {
                try {
                    //休眠
                    //注意,休眠时间建议调高一点
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                socketChannel.write(ByteBuffer.wrap(next.getBytes()));
            }
//            if ("exit".equals(next)) {
//                //等于exit时关闭channel
//                socketChannel.close();
//                break;
//            }
        }
    }

休眠时间记得调高点!!!宕机警告!

image.png

 

这样客户端就会在读取到第一次时,一直发送这个数据,可以看到一些线程,也是只有在收到数据之后才会创建这个线程去打印这个数据。如果休眠时间调高一点的话,就会看到有时候这里会一闪一闪的,调低后就会出现一闪而过的很多线程,如下图。

image

 

四、总结

BIO的话,每次网络请求过来之后,服务器都是会为这个请求创建一个线程,这个线程会一直等待这个请求后续的数据,等处理完成后才会销毁这个线程;而NIO,当每次网络请求过来时,服务器不会马上创建一个线程去处理这个请求,而是会交给一个Selector线程,只有这个请求后续的数据全部传输过来后,Selector才会去通知其他其他线程或者创建一个线程来处理这个请求。

这就是NIO和BIO最大的差别,只有数据传输到服务器时才会让线程去处理,减少了线程的空等待,大部分情况下可以采用线程池的方式来处理数据,可以提高线程的利用率。

Java NIO与Java BIO的区别是什么? 1、什么是Java NIO? 同步非阻塞io模式,拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。 Java NIO有三大组成部分:Buffer;Channel;Selector。 通过事件驱动模式实现了什么时候有数据可读的问题。 Channel:相当于IO操作的载体,相当于一个硬件设备,一个文件,一个socket或是区别程序中的不同IO操作,如read,write。 ... 阅读详情

相关推荐

NIO、BIO、AIO的区别,及NIO的应用和框架选型

AIO、BIO、NIO的区别 IO模型主要分类: 同步(synchronous) IO和异步(asynchronous) IO 阻塞(blocking) IO和非阻塞(non-blocking)IO 同步阻塞(blocking-IO)简称BIO 同步非阻塞(non-blocking-IO)简称NIO 异步非阻塞(synchronous-non-blocking-IO)简称AIO 1.BI...

weixin_43649691的博客 1085

【Java】NIO和BIO有什么区别?回答:天壤之别

NIO是java1.4中引入的,被称为**new I/O**,也有说是**non-blocking I/O**。我个人认为,non-blocking I/O是包含在new I/O里面的,而我们大多数讲的NIO都是网络编程里的概念,但是我们今天主要讲的是数据处理的这一块的内容。

程序员徐小白的博客 6700

Cherry Studio部署MCP服务报错全记录:从零解决‘Connection closed‘问题

本文详细记录了在Cherry Studio中部署MCP服务时遇到‘Connection closed’报错的完整排查与解决过程。文章从环境依赖(UV、Bun)的安装验证、绝对路径配置、网络镜像源设置,到服务端手动调试与Cherry Studio配置检查,提供了一套系统性的解决方案,帮助开发者彻底解决此类连接问题。

g9h0i1的博客 764

NIO和BIO的比较

NIO和BIO的比较1. NIO和BIO的比较2. NIO中三大组件关系2.1 Buffer2.2 Channel(通道)2.3 Buffer和Channel的注意事项和细节。2.4 Selector(选择器) 1. NIO和BIO的比较 BIO以流的方式处理数据,而NIO以块的方式处理数据,块I/O的效率比流I/O高很多。 BIO是阻塞的,NIO是非阻塞的 BIO基于字节流和字符流进行操作,而NIO是基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写

Yolyn‘s blog 5709

【WSL2 Win10】解决子系统中nividia-smi出现的Failed to initialize NVML GPU access blocked by the operating systeM

环境:WIN10专业版 WSL2 Ubuntu x64架构 尝试在WSL2中装CUDA,装好以后在wsl系统中输入nvidia-smi命令,结果报错。但是在Win10的CMD中正常显示 Failed to initialize NVML: GPU access blocked by the operating system Failed to properly shut down NVML: GPU access blocked by the operating system在网上搜了一下,没太多类似的情况

6745

不写代码,Cursor 10分钟开发1个APP!保姆级教程喂饭来了

做出第一个能运行的app,那种成就感真的很棒。虽然过程可能有点折腾,但只要耐心一点,问题都能解决。记住,遇到问题不要慌,现在有AI帮忙,大部分问题都能快速解决。重要的是迈出第一步,开始动手实践。你的第一个app可能很简单,但这是一个很好的开始。随着经验积累,你能做出的东西会越来越酷。现在就开始行动吧,说不定下个月你就能向朋友炫耀你自己做的app了!

chenhong007的博客 1551

BIO和NIO的区别

1.BIO基本介绍 BIO是传统的Java IO编程,其基本的类和接口在java.io包中 BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销 BIO方式使用于连接数目比较小且固定的架构,这种服务方式对服务器资源要求比价高,并且局限于应用中,JDK1.4以前的唯一选择,程序简单易理解 BIO基本模型: 2.NIO基本介绍 NIO全称 java non-blocking

炸酱面的博客 2万+

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

【面试】Java 中的 BIO、NIO 和 AIO:区别、使用及实例

BIO、NIO 和 AIO 是 Java 中重要的 I/O 模型,对编写高效 Java 网络应用程序意义重大。本文先阐述 BIO 为阻塞式 I/O,线程执行 I/O 操作时会被阻塞,适用于并发连接少的场景并给出示例;接着介绍 NIO 是非阻塞式 I/O,通过通道和缓冲区及 Selector 提升并发处理能力,适用于高并发轻量级 I/O 场景并附代码;然后说明 AIO 是异步 I/O,操作异步完成通过回调通知线程,适用于高并发重量级 I/O 场景也有示例;

2202_75481735的博客 2876

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

S7-1200PLC与昆仑通态触摸屏以太网通信的具体方法和步骤(图文)

Robot_PLC_HMI_Automation 1万+

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 44

【Java网络编程】:BIO,NIO和AIO的区别。

1. IO方式的分类 1.1. 基本的概念 首先我们要先搞清楚几个概念。什么是阻塞和非阻塞。什么是同步和异步。 同步和异步:是针对应用程序和内核的交互而言的。同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪;而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。 阻塞和非阻塞:阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作...

hxcaifly的博客 741

《YOLOv12魔术师专栏》专栏介绍 & 专栏目录

《YOLOv12魔术师专栏》专栏介绍 & 专栏目录

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 5059

Java NIO:BIO,NIO和AIO的区别

(1)BIO,同步阻塞式,一个连接一个线程。 使用BIO模式建立网络连接,需要在服务端启动一个ServerSocket,然后客户端启动Socket进行通信。服务器对每个请求建立若干线程等待请求,客户端发送请求后,先循询问服务端是否有线程,如果没有则等地啊或者遭到拒绝请求,如果有,客户端线程会等待请求结束后踩继续执行。 (2)NIO,同步非阻塞IO, 一个请求一个线程。 NIO基于Rea...

我的代码路程 2202

YOLO11 改进系列 | 引入2023年 MLCA 的 C3k2_MLCA 模块,近零参数开销的本地-全局通道注意力,适合检测与分割特征增强

本文提出将MLCA(混合局部通道注意力)模块嵌入YOLOv11的C3k2框架中,形成C3k2_MLCA改进结构。该模块通过5×5局部池化和1×1全局池化双路融合,结合ECA式Conv1d生成通道注意力,在几乎不增加参数量的前提下(仅增加66个参数),实现了局部空间信息与全局通道统计的联合建模。相比传统SE和ECA注意力,MLCA保留了空间分布信息,更适合实例分割等需要精细定位的任务。实验表明改进后模型参数量仅增加0.002%,计算量基本不变,是一种高效的注意力增强方案。

qq_44224801的博客 93

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java IO:BIO和NIO区别及各自应用场景

引言BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。下面通过一个例子解释两者区别:假设当前服务

jiq•钦's technical Blog 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java aio bio nio性能_高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型...

谈到并发编程就不得不提到NIO,以及相关的Java NIO框架Netty等,并且在很多面试中也经常提到NIO和AIO、同步和异步、阻塞和非阻塞等的区别。我先简短介绍下几个NIO相关的概念,然后再谈NIO重点掌握内容,以及Java NIO框架选型。高并发编程系列AIO、BIO、NIO的区别IO模型主要分类:同步(synchronous) IO和异步(asynchronous) IO阻塞(blocki...

weixin_35669712的博客 312

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?

Java NIO(New IO)和BIO(Blocking IO)是Java中处理IO操作两种不同的机制。它们之间的主要区别在于如何处理阻塞和线程使用。

杰哥在此的专栏 1415

java的I/O面试:BIO、NIO 和 AIO 这三者的区别

即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。线程可以在一个通道上执行 I/O 操作时,检查其他通道的状态,避免每个请求单独占用一个线程。,因此,如果有大量的并发请求,会创建大量的线程,线程上下文切换和内存消耗导致系统性能下降。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器需要启动一个线程进行处理。线程会发起 I/O 请求,然后立即返回,不会被阻塞。:每个 I/O 操作不会阻塞线程,线程可以处理其他任务。的 I/O 模型,所有的。

cbk_csdn的博客 372

bio linux 创建_Java基础:BIO、NIO、AIO 的区别和应用场景

简单回顾对于IO我们应该非常熟悉了,IO不仅仅针对文件的操作,网络编程socket的通信,就是IO操作。输入、输出流(InputStream、OutputStream)用于读取或写入字节,如操作图片、视频等。Reader和Writer 则用于操作字符,增加了字符编码功能。本质上计算机操作都是字节,不管是网络或者文件,Reader和Writer等于构建了应用逻辑和原始数据的另一层通道。Bu...

weixin_34816303的博客 93

Java面试题:BIO、NIO和AIO,ArrayList 和 LinkedList、 Vector 和 ArrayList、Array 和 ArrayList 的区别、如何实现数组和 List 转换

Java面试题:BIO、NIO和AIO,ArrayList 和 LinkedList、 Vector 和 ArrayList、Array 和 ArrayList 的区别、如何实现数组和 List 转换

hutao8896的博客 486

深入解析Java NIO:从BIO到Reactor模式的网络编程演进

本文系统介绍了Java网络编程中的Socket、NIO及相关技术。Socket是应用层与TCP/IP协议族的中间层,通过IP地址和端口号建立通信链路。文章比较了BIO(同步阻塞)和NIO(同步非阻塞)模型,详细讲解了NIO三大核心组件:Selector、Channel和Buffer的工作原理。针对高并发场景,提出了Reactor模式及其多线程优化方案,包括单线程、工作者线程池和主从多线程三种实现方式。最后讨论了RPC框架的设计要点,分析了其与HTTP协议的关系,并指出实现RPC需要考虑代理、序列化和服务实例

qq_74092815的博客 977

Java--BIO、NIO、AIO--区别/使用/实例

本文介绍Java的IO模型:BIO、NIO、AIO的区别。

IT利刃出鞘的博客 8971
上一篇: 什么是Java多线程的 等待(wait)/通知(notify)模式?
下一篇: 消息中间件架构体系 - Kafka:从“入门”到“进阶”,也不是很难!
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值