java基础--AIO

目录

1介绍

2AIO的同步写法

3AIO异步非阻塞


1介绍

        阻塞:请求线程发送请求给处理线程,处理线程不给回应,请求线程就一直等待,不可以处理其他任务。

        非阻塞:请求线程发送请求给处理线程,处理线程不给回应,请求线程继续执行其他任务,每隔一段时间来查看处理线程是否有回应。

        同步:客户端或请求的连接发送给服务端,需要一直等待到服务端处理完毕。

        异步:客户端或请求的连接发送给服务端,不需要等待,可以执行其他任务,服务端处理完请求后会会写给客户端。

        阻塞和非阻塞是线程层面的概念,阻塞:当前线程不可以向下执行,非阻塞:当前线程可以向下执行,但是每过一段时间要来看线程是否处理完毕。

        同步和异步是对于一次交互的请求而言,同步:请求过后,没有处理完成就一直等待,异步:请求过后,就继续处理其他任务了,处理好了之后会通知其结果。

       以餐厅的角度解释同步阻塞、同步非阻塞、异步非阻塞:

        同步阻塞:服务员拿着客户点的菜去找厨师,厨师没做好呢,服务员一直等着,等待厨师做好交给服务员。

        同步非阻塞:服务员拿着客户点的菜去找厨师,厨师没做好呢,服务员去做擦桌子了,过一段时间再来看看厨师做没做好。

        异步非阻塞:服务员拿着客户点的菜去找厨师,厨师没做好呢,服务员不理厨师了,让厨师做好菜后来告诉他。

2AIO的同步写法

        

        //客户端
        AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
        //绑定端口
        assc.bind(new InetSocketAddress(9999));
        //获取连接
        Future<AsynchronousSocketChannel> accept = assc.accept();
        AsynchronousSocketChannel asc = accept.get();
        //创建数组
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //读取内容长度
        Future<Integer> read = asc.read(buffer);
        Integer len = read.get();
        //获取内容
        System.out.println(new String(buffer.array(),0,len));
        //关闭资源
        asc.close();

        accept、read是阻塞方法,有返回值就是同步的。

3AIO异步非阻塞

        //客户端
        AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open();
        //绑定端口
        assc.bind(new InetSocketAddress(9999));
        //获取连接
        assc.accept(123, new CompletionHandler<AsynchronousSocketChannel, Integer>() {
            //成功回调
            @Override
            public void completed(AsynchronousSocketChannel result, Integer attachment) {
                System.out.println("连接成功了 我笑了"+attachment+"秒。");
                //获取连接成功了 开始读取数据
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                result.read(buffer, 99, new CompletionHandler<Integer, Integer>() {
                    @Override
                    public void completed(Integer result, Integer attachment) {
                        System.out.println("读取成功了 我赢了"+attachment+"块钱。");
                        System.out.println(new String(buffer.array(),0,result));
                    }
                    @Override
                    public void failed(Throwable exc, Integer attachment) {
                    }
                });
            }
            //失败回调
            @Override
            public void failed(Throwable exc, Integer attachment) {
            }
        });
        System.out.println("跑这儿来了。");
        Thread.sleep(10000);

        accept、read方法是阻塞方法,没有返回值就是异步的,在异步中需要书写回调函数。

        以上就是部分AIO的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值