一、概述

AIO叫异步阻塞

阻塞: 方法会一直等待不往下执行就是阻塞。

非阻塞:方法不会等待,直接向下执行就是非阻塞。

同步:有阻塞功能的方法需要接受返回值就是同步方法。

异步:有阻塞功能的方法不需要接受返回值有回调函数就是异步方法。

springmvc 异步非阻塞 java异步非阻塞实现方式_AIO

//BIO:   同步阻塞    ServerSocket
//NIO:   同步非阻塞  ServerSocketChannel
//AIO:   异步非阻塞  AsynchronousServerSocketChannel

二、AIO异步非阻塞-连接accept()

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class Test服务器 {
    public static void main(String[] args) throws IOException {

        //BIO:   同步阻塞    ServerSocket
        //NIO:   同步非阻塞  ServerSocketChannel
        //AIO:   异步非阻塞  AsynchronousServerSocketChannel
        //创建服务器对象
        AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
        //绑定端口
        assc.bind(new InetSocketAddress(8000));

        //连接客户端
        //A 是一个泛型可以使用任意引用类型,代表是备注信息
        //CompletionHandler 是一个匿名内部类,代表回调函数
        System.out.println(1);
        //异步非阻塞!!!
        assc.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
            @Override
            //在连接客户端成功的情况下会自动执行completed方法
            public void completed(AsynchronousSocketChannel result, Object attachment) {
                System.out.println("连接成功");
            }

            @Override
            //在连接客户端失败的情况下会自动执行failed方法
            public void failed(Throwable exc, Object attachment) {

            }
        });
        System.out.println(2);


        //模拟服务器是不结束的
        while(true){

        }
    }
}

三、AIO异步非阻塞-读read()

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class Test服务器2 {
    public static void main(String[] args) throws IOException {

        //BIO:   同步阻塞    ServerSocket
        //NIO:   同步非阻塞  ServerSocketChannel
        //AIO:   异步非阻塞  AsynchronousServerSocketChannel
        //创建服务器对象
        AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
        //绑定端口
        assc.bind(new InetSocketAddress(8000));

        //连接客户端
        //A 是一个泛型可以使用任意引用类型,代表是备注信息
        //CompletionHandler 是一个匿名内部类,代表回调函数
        System.out.println(1);
        //异步非阻塞!!!
        assc.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
            @Override
            //在连接客户端成功的情况下会自动执行completed方法
            public void completed(AsynchronousSocketChannel sc, Object attachment) {
                //服务端在连接成功之后应该接受数据
                //准备数组
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                //读取数据
                //异步非阻塞读取!!!!
                //ByteBuffer 是一个数组,用于存放读取到的数据
                //A 是一个泛型可以使用任意引用类型,代表是备注信息
                //CompletionHandler 是一个匿名内部类,代表回调函数
                System.out.println(3);
                sc.read(buffer, null, new CompletionHandler<Integer, Object>() {
                    //在读取数据成功之后会自动执行
                    @Override
                    public void completed(Integer len, Object attachment) {
                        //打印读取到的信息
                        System.out.println(new String(buffer.array(),0,len));
                        System.out.println(5);
                    }
                    //在读取数据失败之后会自动执行
                    @Override
                    public void failed(Throwable exc, Object attachment) {

                    }
                });
                System.out.println(4);
            }

            @Override
            //在连接客户端失败的情况下会自动执行failed方法
            public void failed(Throwable exc, Object attachment) {

            }
        });
        System.out.println(2);


        //模拟服务器是不结束的
        while(true){

        }

    }
}

springmvc 异步非阻塞 java异步非阻塞实现方式_springmvc 异步非阻塞_02

四、AIO客户端演示【了解】

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class Test客户端2 {
    public static void main(String[] args) throws IOException {
        //BIO:   Socket
        //NIO:   SocketChannel
        //AIO:   AsynchronousSocketChannel
        AsynchronousSocketChannel asc = AsynchronousSocketChannel.open();
        //连接服务器
        //异步非阻塞的连接服务器的方法!!!
        //SocketAddress 要连接的服务器的ip和端口
        Integer a = 10;
        //A 泛型 备注信息  没用 把匿名内部类外面的数据传到匿名内部类里面
        //CompletionHandler 匿名内部类代表回调函数
        asc.connect(new InetSocketAddress("192.168.171.32", 8000), a, new CompletionHandler<Void, Integer>() {
            //连接上服务器之后自动执行
            @Override
            public void completed(Void result, Integer attachment) {

                //发送数据
                System.out.println("发送数据");
                System.out.println(attachment);
            }

            @Override
            //在连接失败时候会自动执行
            public void failed(Throwable exc, Integer attachment) {
                System.out.println("连接失败");
                System.out.println(attachment);
                attachment = 20;
            }
        });

        //循环为了让程序别结束
        while(true){

        }
    }
}

匿名内部类小问题回顾

public class Test {
    public static void main(String[] args) {

         int a = 10;

        //匿名内部类如果使用外部类的局部变量,变量会自动变成final修饰
        Inter i = new Inter() {
            @Override
            public void method() {
                //a = 20;
                //System.out.println(a);
            }
        };

    }
}

BIO、NIO、AIO总结

BIO
    同步阻塞
NIO
    同步非阻塞    (非阻塞就是方法不会等待,可以直接向下执行。)
    Buffer   缓冲区
    Channel  通道
    Selector 选择器
AIO
    异步非阻塞     (异步就是没有返回值,在成功之后会自动调用回调函数)