什么是异步
同步调用:调用方在调用过程中,持续等待返回结果。
异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。
脱离IO
,单独讨论同步
和异步
,我们更加容易去理解它的原理,同步和异步其实属于一种通信机制
,表达的是,我们在通信过程中,是主动去询问,还是等对方主动反馈。体现在同步(主动)
和异步(被动)
上。
进程内异步调用
1、Thread
进程和线程:进程是资源分配的最小单位,线程是CPU调度的最小单位
Java进程
内最简单的异步调用方式,就是通过 new Thread().start()
的方式,启动新的线程进行任务的执行(CPU调度
)。
public static void main(String[] args) {
System.out.println("煲水");
//创建新的线程
Thread thread1= new Thread(()->{
try {
Thread.sleep(5000);
System.out.println("水开了,"+Thread.currentThread().getName());
}catch (Exception e){
e.printStackTrace();
}
});
thread1.start();
System.out.println("运动");
}
1.1、start() 和 run()
在上述实例代码中,我们虽然采用了实现 Runnable
接口的方式,进行新线程的实现,但是在方法启动时,并没有使用 run()
方法,而是使用了 start()
方法。
run():使用当前线程执行 run()方法调用,可以理解时同步调用
start()
方法在调用时,在代码逻辑中,会调用到一个本地方法 start0
下载 JDK源码后,可以看到 Thread 类
有个 registerNatives
本地方法,该方法主要的作用就是注册一些本地方法供 Thread 类使用,如 start0(),stop0()
等等,可以说,所有操作本地线程的本地方法都是由它注册的。
可以看出 Java 线程
调用 start->start0
的方法,实际上会调用到 JVM_StartThread
方法,通过调用 new JavaThread(&thread_entry,sz)
完成线程的创建。
在 jvm.cpp
中,有如下代码段:
在创建完线程后,通过 thread_entry
完成 run()
方法的调用
1.2、Future
Future
的调用方式,属于同步非阻塞
, 主要原因在于,在获取异步线程处理结果时,需要主线程主动去获取,异步线程并没有通过