【juc】countdownlatch实现并发网络请求
目录
- 一、截图示例
- 二、代码示例
- 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;}
}
相关文章:

【juc】countdownlatch实现并发网络请求
目录 一、截图示例二、代码示例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.uti…...

在供应链管理中,如何做好库存分析?库存分析有哪些监控指标?
在供应链管理中,库存分析是其重要的一环。库存分析的方法繁杂且广泛,选择正确的方法才能更好的进行库存分析,下面就为大家盘点一些常用的库存分析方法和监控指标,全程干货,建议收藏! 01 如何进行库存分析&…...

黑豹程序员-架构师学习路线图-百科:Database数据库
文章目录 1、什么是Database2、发展历史3、数据库排行网4、总结 1、什么是Database 当今世界是一个充满着数据的互联网世界,各处都充斥着大量的数据。即这个互联网世界就是数据世界。 支撑这个数据世界的基石就是数据库,数据库也可以称为数据的仓库。 …...
你相信光吗?黑灯工厂重新相信“光”
你知道“黑灯工厂”吗?望文生义,所谓黑灯工厂,就是可以不需要照明的工厂。全程流水线自动化生产,无人干预、无人值守,工厂变成黑匣子,原材料进去,成品出来,流水线上百分百自动化。 完…...

Ubuntu 20.04使用源码安装nginx 1.14.0
nginx安装及使用(详细版)是一篇参考博文。 http://nginx.org/download/可以选择下载源码的版本。 sudo wget http://nginx.org/download/nginx-1.14.0.tar.gz下载源代码。 sudo tar xzf nginx-1.14.0.tar.gz进行解压。 cd nginx-1.14.0进入到源代码…...
springboot框架拦截器中HttpServletRequest 请求如何区分是图片上传流还是普通的字符流?
在Spring Boot框架中的拦截器(Interceptor)中,可以通过检查Content-Type请求头来区分图片上传流和普通的字符流。 当客户端发送POST请求并携带文件时,Content-Type请求头通常会包含multipart/form-data或者类似的值。这表明该请求…...

简单聊聊 TCP 协议
简单聊聊 TCP 协议 如何实现可靠传输 ?完全可靠存在比特差错存在丢包流水线可靠数据传输协议回退N步 (GBN)选择重传 (ARQ) 小结 TCPTCP 连接报文段结构序号和确认号 可靠数据传输避免重传超时时间加倍快速重传回退N步还是选择重传 流量控制连接管理拥塞控制拥塞原因拥塞控制方…...

钡铼BL124PN:简单快速转换Profinet到Ethernet/IP
钡铼技术BL124PN是一款高性能的Profinet转Ethernet/IP网关设备。该网关专为工业自动化领域设计,用于实现不同协议之间的互连和通信。BL124PN采用可靠稳定的硬件和先进的通信技术,具有以下主要特点: 协议转换能力:BL124PN能够将Pr…...
【golang】go 空结构体 详解 空结构体内容占用及大小
一、空结构体基础 空结构实例 和 空结构体变量 本质是一样的 1、所有空结构体地址都是一样的2、大小都为0(最独特的) package mainimport ("fmt""time""unsafe" )type EST struct { }func main() {// 一、基础// 空结构…...
身为产品经理该如何向客户推广API商品数据接口
在当今数字化的时代,API(Application Programming Interface,应用程序编程接口)已成为各种软件应用程序之间交互数据的主要方式。API商品数据接口作为一种特殊类型的API,能够让不同的系统之间共享商品数据,…...
【数据结构】460. LFU 缓存
460. LFU 缓存 解题思路 get操作 返回key对应的val 然后增加对应的freq插入操作 如果key已经存在 直接进行更新 如果不存在 但是容器已经满了 直接进行删除freq最小的Key 之后进行插入 class LFUCache {// key到 val的映射 KVHashMap<Integer,Integer> keyToVal;// …...
文字转语音播报模块(一):阿里云nls服务使用示例
一、业务场景 最近笔者在业务中涉及到语音告警的模块,需要讲告警内容以文件或流形式返回给前端进行语音播报,具体的分析与处理如下 二、业务分析 首先告警内容提示信息这里做的处理是通过专门字段去存储、编辑,根据拟定好的代码逻辑判断是…...

Vscode配置C#编程环境(win10)
目录 1、安装好Vscode 2、下载安装.NetCore SDK 3、配置C#环境 3.1 打开Vscode并下载扩展 3.2 Vscode中打开文件夹并配置环境 3.3 调试运行 1、安装好Vscode 2、下载安装.NetCore SDK 官网如下,下载完成后双击打开一路走到底就行.NetCore SDK官网 软件显示安…...
python:xlrd 读取 Excel文件,显示在 tkinterTable 表格中
pip install xlrd xlrd-1.2.0-py2.py3-none-any.whl (103 kB) 摘要: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files pip install tkinterTable tkintertable-1.3.3.tar.gz (58 kB) 摘要: Extendable table class for Tkinter 源代…...

深度学习——深度学习计算一
深度学习——深度学习计算一 文章目录 前言一、层和块1.1. 自定义块1.2. 顺序块1.3. 在前向传播函数中执行代码1.4. 小结 二、参数管理2.1. 参数访问2.1.1. 目标参数2.1.2. 一次性访问所有参数2.1.3. 从嵌套块收集参数 2.2. 参数初始化2.2.1. 内置初始化2.2.2. 自定义初始化 2.…...

yolov5及yolov7实战之剪枝
之前有讲过一次yolov5的剪枝:yolov5实战之模型剪枝_yolov5模型剪枝-CSDN博客 当时基于的是比较老的yolov5版本,剪枝对整个训练代码的改动也比较多。最近发现一个比较好用的剪枝库,可以在不怎么改动原有训练代码的情况下,实现剪枝的…...

力扣第257题 二叉树的所有路径 c++ 树 深度优先搜索 字符串 回溯 二叉树
题目 257. 二叉树的所有路径 简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:["1->2-&g…...
保研之旅·终
一.背景 学校: 中211 通信工程专业 成绩: 绩点前3% 英语: CET4:523 CET6:505 竞赛:两个国奖,若干省奖 科研:两项校级大创,无论文产出 二.基本情况 夏令营入营: 哈工大…...

达梦数据库 视图 错误 [22003]: 数据溢出
今天通过DBeaver连接访问达梦数据库的一个视图,报错:错误 [22003]: 数据溢出 经过分析,原因是视图字段的数据类型和原表的数据类型不一致造成的...
【文献阅读】【NMI 2022】LocalTransform :基于广义模板的有机反应性准确预测图神经网络
预测有机反应产物是有机化学的一个基本问题。基于成熟有机化学知识,化学家现在能够设计实验来制造用于不同目的的新分子。但是,它需要经验丰富的专业化学家来准确预测化学反应的结果。为了进一步帮助有机化学家并在数字化学时代实现全自动发现࿰…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...