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项目方法结束==============>

原文地址:https://www.cnblogs.com/zwcry/p/9662499.html

时间: 2024-11-13 09:56:52

java CountDownLatch 控制异步和同步的相关文章

java线程控制、状态同步、volatile、Thread.interupt以及ConcurrentLinkedQueue

在有些严格的系统中,我们需要做到干净的停止线程并清理相关状态.涉及到这个主题会带出很多的相关点,简单的总结如下: 我们知道,在java中,有一个volatile关键字,其官方说明(https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)为: Using volatile variables reduces the risk of memory consistency errors, because any

Java线程:线程的同步与锁

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. public class Foo {     private int x = 100; public int getX() {         return x;     } public int fix(int y) {         x = x - y;         return x;     } }

关于异步,同步,阻塞与非阻塞

如果你想吃一份宫保鸡丁盖饭: 同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊! 同步非阻塞:在饭馆点完餐,就去遛狗了.不过溜一会儿,就回饭馆喊一声:好了没啊! 异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿. 异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了. 在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,

JAVA实现的异步redis客户端

再使用redis的过程中,发现使用缓存虽然好,但是有些地方还是比较难权衡,缓存对象大了,存储对象时的序列化工作很繁重,消耗大量cpu:那么切分成很小的部分吧,存取的次数变多了,redis客户端的交互次数上不去,这是一个矛盾.要是有一个客户端能支持更多的交互次数,那么在完成既定指标的前提下,岂不是可以让我们的建模工作变的更宽松一些? 于是参照redis协议,花了5天时间,做了一个具备基本功能的redis客户端.它的特性: 1.支持异步调用,在getA之后不用等结果,能继续getB,getC,等等.

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i

Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)

在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白几个概念,什么是阻塞和非阻塞,什么是同步和异步,同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知).而阻塞和非阻塞

什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么(转)

1.什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?     同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系.     电路设计可分类为同步电路和异步电路设计.同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和 “完成”信号使之同步.由于异步电路具有下列优点--无时钟歪斜问题.低电源消耗.平均效能而非最差效能.模块性.可组合和可复用性--因此近年来对异步 电路研究增加快速,论文发表数以倍增,而Intel P

控制异步回调利器 - async 串行series,并行parallel,智能控制auto简介

async 作为大名鼎鼎的异步控制流程包,在npmjs.org 排名稳居前五,目前已经逐渐形成node.js下控制异步流程的一个规范.async成为异步编码流程控制的老大哥绝非偶然,它不仅使用方便,文档完善,把你杂乱无章的代码结构化,生辰嵌套的回掉清晰化. async 提供的api包括三个部分: (1)流程控制 常见的几种流程控制. (2)集合处理 异步操作处理集合中的数据. (3)工具类 . github 开源地址: https://github.com/caolan/async 安装方法:

nodejs异步转同步

项目在微信环境开发,需要获取access_token进行授权登录和获取用户信息. 特意把这块功能拿出来封装一个自定义module module.exports = new Wechat(con.appid, con.secret, con.url); 之前appid和secret是在本地配置文件写死的,后来要求系统后台可以配置公众号. 就需要从后台请求来获取配置参数.这就遇到问题了. var wechat = require('./modules/wechat'); var rule = new