IO分类:分为BIO、NIO(同步非阻塞)、AIO(异步非阻塞)
IO多路复用三种函数:select、poll、epoll
一切程序皆文件,这样对于我们程序员来说,只需要open、read、write、close接口,即可完成全部操作。
文件描述符
FD,一个索引,内核中维护了一些数据结构,通过文件描述符能找到对应的文件,文件读写到了那里。
比如调用open(‘file:// ***’)函数,返回值就是对应的文件描述符,将来我们调用read()/ write()的时候,参数就是对应的文件描述符
传统的web服务器中,当我们三次握手成功后,通过调用accept函数,可以得到对应的文件描述符(进行网络通信的),也叫套接字。
通过读写该文件描述符我就可以从客户端进行通信,服务端则是通过客户端发来的请求,去做某些逻辑。
这样的话,如果我将来有多个文件描述符需要去处理,如果用传统的阻塞读,效率会非常低。
引入了IO多路复用机制
我们将一堆文件描述符丢给内核,委托内核来帮我们处理,
如果将来文件描述符状态发生了变更(可读/写),则你再告诉我,然后内核就会返回出一个就绪的文件描述符列表
实现异步的方式主要在于父(主)进程,创建专门的(子)线程去处理请求,创建好之后立马返回。如果这个处理请求的函数来自于外部传入的参数,那么它就叫回调函数,反之就不叫回调函数。我们只是使用回调函数来处理请求,他无法帮我们实现异步。
是不是异步最重要的是看是否等待某个函数, 如果不等待某个函数而马上执行其他函数就是异步 所以实际上就算是单线程也是可以实现异步的,而不需要多线程(使用编辑事件循环或者信号量)
同步、异步、回调函数的关系
用了回调函数不代表就是异步了,大部分场景还是要结合子线程去完成
定义一个回调函数
public interface Callback {
void onResult(int result);
}
下面代码执行结果:
结果是8
同步
public class CallBackCase {
public static void main(String[] args) throws InterruptedException {
// 重写回调函数逻辑
long startTime = new Date().getTime();
Callback callback = result -> System.out.println("结果是: " + result);
performOperation(5, 3, callback);
long endTime = new Date().getTime();
String str = endTime-startTime < 5000 ? "异步":"同步";
System.out.println(str);
}
public static void performOperation(int a, int b, Callback callback) throws InterruptedException {
int result = a + b;
sleep(5000);
callback.onResult(result);
}
}
下面代码执行结果:
异步
结果是8
public static void main(String[] args) throws InterruptedException {
// 重写回调函数逻辑
long startTime = new Date().getTime();
Callback callback = result -> System.out.println("结果是: " + result);
new Thread(() -> {
try {
performOperation(5, 3, callback);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
long endTime = new Date().getTime();
String str = endTime-startTime < 5000 ? "异步":"同步";
System.out.println(str);
}
通过以上结论,如果只是单纯使用回调函数,不去开启子线程,那么无非就是在执行main方法的时候,同步去等待performOperation方法执行结束,结束时再去执行callback里面的逻辑。
相对的,开启子线程,我们将回调函数作为方法参数,并将这个方法交给子线程,那么主线程直接接着往下走(同时子线程去完成耗时长的performOperation方法),先打印异步,接着输出结果8
标签:异步,函数,文件,编程,网络,callback,描述符,result,IO From: https://blog.csdn.net/weixin_64842400/article/details/143256489