目录
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的知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!