《高性能利器》--异步调用有哪些实现方式?

本文探讨了Java中实现异步调用的不同方法,包括Thread的start()与run()、Future、ThreadPoolExecutor、EventBus和Spring Event。详细分析了每种方式的工作原理,如Thread的线程创建过程,Future如何获取异步结果,以及EventBus的观察者模式和AsyncEventBus的异步事件处理。同时,文章还涉及了Spring的异步事件处理机制,如@Async和ApplicationEventMulticaster。最后,简要提到了进程间异步调用,如Dubbo的异步调用和消息队列在解耦中的应用。
摘要由CSDN通过智能技术生成

什么是异步

同步调用:调用方在调用过程中,持续等待返回结果。

异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。

脱离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 的调用方式,属于同步非阻塞, 主要原因在于,在获取异步线程处理结果时,需要主线程主动去获取,异步线程并没有通过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值