java 异步调用方法

Python027

java 异步调用方法,第1张

1. 使用wait和notify方法

这个方法其实是利用了锁机制,直接贴代码:

public class Demo1 extends BaseDemo{ private final Object lock = new Object()@Override public void callback(long response) { System.out.println("得到结果")System.out.println(response)System.out.println("调用结束")synchronized (lock) { lock.notifyAll()} } public static void main(String[] args) { Demo1 demo1 = new Demo1()demo1.call()synchronized (demo1.lock){ try { demo1.lock.wait()} catch (InterruptedException e) { e.printStackTrace()} } System.out.println("主线内容")} }

可以看到在发起调用后,主线程利用wait进行阻塞,等待回调中调用notify或者notifyAll方法来进行唤醒。注意,和大家认知的一样,这里wait和notify都是需要先获得对象的锁的。在主线程中最后我们打印了一个内容,这也是用来验证实验结果的,如果没有wait和notify,主线程内容会紧随调用内容立刻打印而像我们上面的代码,主线程内容会一直等待回调函数调用结束才会进行打印。

没有使用同步操作的情况下,打印结果:发起调用 调用返回 主线程内容 得到结果 1 调用结束

而使用了同步操作后:

发起调用 调用返回 得到结果 9 调用结束 主线程内容2. 使用条件锁

和方法一的原理类似:

public class Demo2 extends BaseDemo { private final Lock lock = new ReentrantLock()private final Condition con = lock.newCondition()@Override public void callback(long response) { System.out.println("得到结果")System.out.println(response)System.out.println("调用结束")lock.lock()try { con.signal()}finally { lock.unlock()} } public static void main(String[] args) { Demo2 demo2 = new Demo2()demo2.call()demo2.lock.lock()try { demo2.con.await()} catch (InterruptedException e) { e.printStackTrace()}finally { demo2.lock.unlock()} System.out.println("主线程内容")} }

基本上和方法一没什么区别,只是这里使用了条件锁,两者的锁机制有所不同。

大家都知道,java是同步顺序执行。当需要异步执行时,需要新创建一个线程完成。

1. 使用常规的方法显示异步调用

第一步 新建 ThreadTest.java 实现 Runnable 接口

第二步 新建测试执行

当然,除了这种显式 new Thread 对象,我们通过线程池获取线程名称,这里不做演示。我们熟悉的spring 在 spring3中提供了@Async注解,来方便开发者优雅的使用异步调用。

2.使用 springboot @Async注解,优雅的实现异步调用

第一步 开启 异步调用注解。

第二步 定义线程池

第三步 创建service 测试类 TestService.java

第四步 新建 Service 实现类 ,TestServiceImpl.java

第五步 测试执行 ,执行结果

SpringBoot使用@Async优雅的异步调用就暂时记录到这里,欢迎评论区一起讨论学习。