【juc】countdownlatch实现并发网络请求

news2024/11/15 23:38:42

目录

        • 一、截图示例
        • 二、代码示例
          • 2.1 测试代码
          • 2.2 接口代码

一、截图示例

在这里插入图片描述
在这里插入图片描述

二、代码示例
2.1 测试代码
package com.learning.countdownlatch;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @Author wangyouhui
 * @Description 异步查询信息
 **/
@Slf4j
public class Learning_03 {
    public static void main(String[] args) {
        test1();
        test2();
    }

    private static void test1() {
        System.out.println("查询信息开始");
        long begin = System.currentTimeMillis();
        log.info("开始时间: {}", begin);
        RestTemplate restTemplate = new RestTemplate();
        long start = System.currentTimeMillis();
        Map<String, Object> map = restTemplate.getForObject("http://127.0.0.1:8080/info/order/{1}", Map.class, 1);
        log.info("订单信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
        start = System.currentTimeMillis();
        map = restTemplate.getForObject("http://127.0.0.1:8080/info/product/{1}", Map.class, 1);
        log.info("产品1信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
        start = System.currentTimeMillis();
        map = restTemplate.getForObject("http://127.0.0.1:8080/info/product/{1}", Map.class, 2);
        log.info("产品2信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
        start = System.currentTimeMillis();
        map = restTemplate.getForObject("http://127.0.0.1:8080/info/package/{1}", Map.class, 1);
        log.info("快递信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
        long end = System.currentTimeMillis();
        log.info("结束时间: {}", end);
        log.info("查询信息结束, 总耗时: {}", end-begin);
    }

    private static void test2() {
        System.out.println("查询信息开始");
        long begin = System.currentTimeMillis();
        log.info("开始时间: {}", begin);
        CountDownLatch countDownLatch = new CountDownLatch(4);
        ExecutorService executorService = Executors.newCachedThreadPool();
        RestTemplate restTemplate = new RestTemplate();
        executorService.submit(()->{
            long start = System.currentTimeMillis();
            Map<String, Object> map = restTemplate.getForObject("http://127.0.0.1:8080/info/order/{1}", Map.class, 1);
            log.info("订单信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
            countDownLatch.countDown();
        });
        executorService.submit(()->{
            long start = System.currentTimeMillis();
            Map<String, Object> map = restTemplate.getForObject("http://127.0.0.1:8080/info/product/{1}", Map.class, 1);
            log.info("产品1信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
            countDownLatch.countDown();
        });
        executorService.submit(()->{
            long start = System.currentTimeMillis();
            Map<String, Object> map = restTemplate.getForObject("http://127.0.0.1:8080/info/product/{1}", Map.class, 2);
            log.info("产品2信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
            countDownLatch.countDown();
        });
        executorService.submit(()->{
            long start = System.currentTimeMillis();
            Map<String, Object> map = restTemplate.getForObject("http://127.0.0.1:8080/info/package/{1}", Map.class, 1);
            log.info("快递信息: {}, 耗时: {}", map, System.currentTimeMillis() - start);
            countDownLatch.countDown();
        });
        // 主线程等待
        try{
            countDownLatch.await();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        executorService.shutdown();
        long end = System.currentTimeMillis();
        log.info("结束时间: {}", end);
        log.info("查询信息结束, 总耗时: {}", end-begin);
    }
}

2.2 接口代码
package com.learning.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @Author wangyouhui
 * @Description TODO
 **/
@RestController
@RequestMapping("info")
@Slf4j
public class InfoController {
    @GetMapping("/order/{id}")
    public Map<String, Object> orderDetail(@PathVariable Long id){
        log.info("开始查找订单: {}", id);
        try {
            Random random = new Random();
            Thread.sleep(2000 + random.nextInt(2000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Map<String, Object> result = new HashMap<>();
        result.put("id", id);
        result.put("total", 1300);
        log.info("查找订单结束: {}", id);
        return result;
    }

    @GetMapping("/product/{id}")
    public Map<String, Object> productDetail(@PathVariable Long id){
        log.info("开始查找产品: {}", id);
        try {
            Random random = new Random();
            Thread.sleep(500 + random.nextInt(2000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Map<String, Object> result = new HashMap<>();
        if(id == 1){
            result.put("id", id);
            result.put("price", 300);
            result.put("name", "小米耳机");
        }else{
            result.put("id", id);
            result.put("price", 1000);
            result.put("name", "三星硬盘");
        }
        log.info("开始查找产品: {}", id);
        return result;
    }

    @GetMapping("/package/{id}")
    public Map<String, Object> packageDetail(@PathVariable Long id){
        log.info("开始查找快递: {}", id);
        try {
            Random random = new Random();
            Thread.sleep(3000 + random.nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Map<String, Object> result = new HashMap<>();
        result.put("id", id);
        result.put("name", "中通快递");
        result.put("id", id);
        log.info("开始查找快递: {}", id);
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1067285.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的药房药品采购集中管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【UE5 Cesium】15-Cesium for Unreal 加载本地地形

目录 一、加载全球无高度地形 二、加载区域DEM 效果 一、加载全球无高度地形 1. 先去如下网址下载全球无高度地形&#xff1a;Using a global terrain layer without height detail - #9 by RidhwanAziz - Cesium for Unreal - Cesium Community 下载后如下&#xff1a; 解…

【Spring Cloud系统】- Zookeer特性与使用场景

【Spring Cloud系统】- Zookeer特性与使用场景 一、概述 Zookeeper是一个分布式服务框架&#xff0c;是Apache Hadoop的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题。如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置…

华为云云耀云服务器L实例评测|Ubuntu 22.04部署edusoho-ct企培版教程 | 支持华为云视频点播对接CDN加速

华为云云耀云服务器L实例评测&#xff5c;Ubuntu 22.04部署edusoho企培版教程 1、选择购买 华为云耀云服务器L实例 简单上云第一步 2、选择你要安装的操作系统&#xff0c;例如 Ubuntu 22.04 server 64bit 3、然后支付订单就行了 4、华为云云耀云服务器L实例创建好之后&#x…

2023年台州市第三届网络安全技能大赛(MISC)—Black Mamba

前言&#xff1a;当时比赛没有做出来现在来复现一下 就当记录一下&#xff08;这个思路没想到&#xff09; Black Mamba&#xff1a; 一张图片 常规得分离&#xff0c;属性&#xff0c;LSB&#xff0c;盲水印等都尝试过 无果&#xff01; 考点&#xff1a;异或解密&#xff0…

一篇理解TCP协议

一、TCP协议概念。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它主要用于在计算机网络中&#xff0c;通过建立可靠的通信连接来进行数据传输。 TCP协议的特点如下&#xff1a; 可靠性&#xf…

满足你甜食需求的葡萄酒是怎样的?

也许这是不言而喻的&#xff0c;但我们认为&#xff0c;如果没有一杯完美的葡萄酒来补充你最喜爱的菜肴的复杂风味&#xff0c;一顿美食就不完整。无论您是享用美味的葡萄酒作为开胃菜&#xff0c;还是搭配主菜&#xff0c;我们相信我们最喜爱的饮料是一餐中任何部分的完美补充…

ESP32设备驱动-TFT_eSPI显示中文

TFT_eSPI显示中文 文章目录 TFT_eSPI显示中文1、安装TFT_eSPI库2、创建字库3、生成字库头文件4、使用字库本文将详细介绍如何使用TFT_eSPI显示中文。 1、安装TFT_eSPI库 2、创建字库 TFT_eSPI字体工具使用Processing软件创建字体。 下载并安装Processing:https://processin…

css的gap设置元素之间的间隔

在felx布局中可以使用gap来设置元素之间的间隔&#xff1b; .box{width: 800px;height: auto;border: 1px solid green;display: flex;flex-wrap: wrap;gap: 100px; } .inner{width: 200px;height: 200px;background-color: skyblue; } <div class"box"><…

6-5 头插法创建单链表(C) 分数 10

struct Node* buildLinkedList(int* arr, int n) {//创建哨兵位struct Node* head (struct Node*)malloc(sizeof(struct Node));head->link NULL;struct Node* node NULL;for (int i 0; i < n; i){//循环创建每一个结点node (struct Node*)malloc(sizeof(struct Nod…

Android系统定制之监听USB键盘来判断是否弹出软键盘

一.项目背景 在设备上弹出软键盘,会将一大部分UI遮挡起来,造成很多图标无法看到和点击,使用起来不方便,因此通过插入usb键盘输入代替软键盘,但是点击输入框默认会弹出软键盘,因此想要插入USB键盘时,默认关闭软键盘,拔出键盘时再弹出,方便用户使用 二.设计思路 2.1…

Python大数据之PySpark(六)RDD的操作

文章目录 RDD的操作函数分类Transformation函数Action函数基础练习[Wordcount快速演示]Transformer算子 -*- coding: utf-8 -*-Program function&#xff1a;完成单Value类型RDD的转换算子的演示1-创建SparkContext申请资源2-key和value类型算子groupByKey[(b, <pyspark.res…

【Java】微服务——Gateway网关

目录 1.为什么需要网关2.gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的流程图 3.3.断言工厂3.4.过滤器工厂3.4.1.路由过滤器的种类3.4.2.请求头过…

idea插件(free mybatis plugin)

安装&#xff1a; 由于我用的idea版本是2023的&#xff0c;所以搜出来的是Free MyBatis Tool,和Free MyBatis plugin是一样的 主要功能&#xff1a; 生成mapper xml文件 快速从代码跳转到mapper及从mapper返回代码 mybatis自动补全及语法错误提示 集成mybatis generator gui…

Java高级之反射

关于反射的举例&#xff1a; 示例代码&#xff1a;Fan.java package testFanShe;/*** author: Arbicoral* Description: 测试反射&#xff1a;* 成员变量&#xff1a;2个public&#xff0c;2个private* 构造器&#xff1a;4个public&#x…

HTML 笔记 表格

1 表格基本语法 tr&#xff1a;table row th&#xff1a;table head 2 表格属性 2.1 基本属性 表格的基本属性是指表格的行、列和单元格但并不是每个表格的单元格大小都是统一的&#xff0c;所以需要设计者通过一些属性参数来修改表格的样子&#xff0c;让它们可以更更多样…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

防火墙-——iptables

目录 安全技术&#xff1a;&#xff08;市场上常见的防御&#xff09; 1.入侵检测机制 2.入侵防御 3.防火墙 4.防水墙 通信的五大要素和四要素 iptables 四个表 数据流程图 安装iptables iptables管理选项: 匹配条件 通用匹配规则 1.查看filter中的 INPUT表 2.清…

性能测试笔记

一、性能测试的概念 性能测试的概念 使用自动化工具&#xff0c;模拟不同的场景&#xff0c;对软件各项性能指标进行测试和评估的过程 性能测试的目的 评估当前系统能力&#xff0c;出现性能bug后&#xff0c;优化性能&#xff1a;预测未来的性能需求是否满足 例如&#xf…

Sketch for mac v98.3(ui设计矢量绘图)

Sketch是一款为用户提供设计和创建数字界面的矢量编辑工具。它主要用于UI/UX设计师、产品经理和开发人员&#xff0c;帮助他们快速设计和原型各种应用程序和网站。 Sketch具有简洁直观的界面&#xff0c;以及丰富的功能集&#xff0c;使得用户可以轻松地创建、编辑和共享精美的…