java CountDownLatch 控制异步和同步
应用场景举例:
执行A项目的方法,需要调用B项目、C项目、D项目的接口方法。
需求:
异步调用B、C、D项目的接口方法,且每个接口都调用结束后,A项目的方法才可以结束。
注:如果需要获取接口返回结果,可以使用缓存(key,value)保存。线程只支持线程外的静态参数传递,不严谨。
package com.sze.redis.async; import java.util.concurrent.CountDownLatch; public class AsyncTest { public static void main(String[] args) throws InterruptedException { System.out.println("<=================A项目方法开始==============>"); CountDownLatch latch = new CountDownLatch(3); Thread B = new Thread(new Runnable() { @Override public void run() { System.out.println("B项目接口调用===开始"); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B项目接口调用===结束"); latch.countDown(); } }); Thread C = new Thread(new Runnable() { @Override public void run() { System.out.println("C项目接口调用===开始"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("C项目接口调用===结束"); latch.countDown(); } }); Thread D = new Thread(new Runnable() { @Override public void run() { System.out.println("D项目接口调用===开始"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("D项目接口调用===结束"); latch.countDown(); } }); System.out.println("B C D start"); B.start(); C.start(); D.start(); latch.await(); System.out.println("<=================A项目方法结束==============>"); } }
结果:
<=================A项目方法开始==============> B C D start B项目接口调用===开始 D项目接口调用===开始 C项目接口调用===开始 D项目接口调用===结束 C项目接口调用===结束 B项目接口调用===结束 <=================A项目方法结束==============>