Java多线程优化接口响应

同步查询

 @Override
public MallOrder getById1(Long id) {long startTime = System.currentTimeMillis();MallOrder mallOrder = new MallOrder();mallOrder.setId(1L);mallOrder.setShopId(3L);mallOrder.setCustomerId(78L);mallOrder.setGoodsId(664L);mallOrder.setOrderTime(LocalDateTime.now());mallOrder.setOrderStatus(1);mallOrder.setTotalAmount(new BigDecimal("129.8"));// 商品Long goodsId = mallGoodsService.getById(mallOrder.getGoodsId());log.info("商品:" + goodsId);// 顾客Long customerId = mallCustomerService.getById(mallOrder.getCustomerId());log.info("顾客:" + customerId);// 店铺Long shopId = mallShopService.getById(mallOrder.getShopId());log.info("店铺:" + shopId);try {Thread.sleep(150);} catch (InterruptedException e) {throw new RuntimeException(e);}long endTime = System.currentTimeMillis();log.info("耗时:" + (endTime - startTime));return mallOrder;
}
package com.qiangesoft.multithread.service.impl;import com.qiangesoft.multithread.service.IMallShopService;
import org.springframework.stereotype.Service;/*** <p>* 店铺信息 服务实现类* </p>** @author qiangesoft* @since 2024-05-06*/
@Service
public class MallShopServiceImpl implements IMallShopService {@Overridepublic Long getById(Long id) {try {Thread.sleep(350);} catch (InterruptedException e) {throw new RuntimeException(e);}return id;}
}
package com.qiangesoft.multithread.service.impl;import com.qiangesoft.multithread.service.IMallGoodsService;
import org.springframework.stereotype.Service;/*** <p>* 商品信息 服务实现类* </p>** @author qiangesoft* @since 2024-05-06*/
@Service
public class MallGoodsServiceImpl implements IMallGoodsService {@Overridepublic Long getById(Long id) {try {Thread.sleep(280);} catch (InterruptedException e) {throw new RuntimeException(e);}return id;}
}
package com.qiangesoft.multithread.service.impl;import com.qiangesoft.multithread.service.IMallCustomerService;
import org.springframework.stereotype.Service;/*** <p>* 客户信息 服务实现类* </p>** @author qiangesoft* @since 2024-05-06*/
@Service
public class MallCustomerServiceImpl implements IMallCustomerService {@Overridepublic Long getById(Long id) {try {Thread.sleep(230);} catch (InterruptedException e) {throw new RuntimeException(e);}return id;}
}

在这里插入图片描述

异步优化

  • 核心线程数不变,仍旧是 cpu 数;
  • 最大线程数不变,仍旧是 cpu 数的5倍;
  • 空闲线程存活时间不变,仍旧是 5 分钟;
  • 使用 SynchronousQueue 替代 LinkedBlockingQueue(1024)。SynchronousQueue 是一个特殊的队列,其最大容量是1。也就是说,任何一次插入操作都必须等待一个相应的删除操作,反之亦然。如果没有相应的操作正在进行,则该线程将被阻塞;
  • 指定拒绝策略为 CallerRunsPolicy。当线程池资源不够时,由主线程来执行任务;

ps:在这个配置下,及时线程池中的所有资源全部耗尽,也只会降级到串行执行,不会让系统变的更糟糕。

private static int coreSize = Runtime.getRuntime().availableProcessors();private final ExecutorService executorService = new ThreadPoolExecutor(coreSize,coreSize * 5,5L,TimeUnit.MINUTES,// 最大容量为1的队列new SynchronousQueue<>(),// 拒绝策略,降级到主线程执行new ThreadPoolExecutor.CallerRunsPolicy());@Overridepublic MallOrder getById(Long id) {long startTime = System.currentTimeMillis();MallOrder mallOrder = new MallOrder();mallOrder.setId(1L);mallOrder.setShopId(3L);mallOrder.setCustomerId(78L);mallOrder.setGoodsId(664L);mallOrder.setOrderTime(LocalDateTime.now());mallOrder.setOrderStatus(1);mallOrder.setTotalAmount(new BigDecimal("129.8"));// 商品Future<Long> goodsFuture = executorService.submit(() -> mallGoodsService.getById(mallOrder.getGoodsId()));// 顾客Future<Long> customerFuture = executorService.submit(() -> mallCustomerService.getById(mallOrder.getCustomerId()));// 店铺Future<Long> shopFuture = executorService.submit(() -> mallShopService.getById(mallOrder.getShopId()));try {Thread.sleep(150);} catch (InterruptedException e) {throw new RuntimeException(e);}try {log.info("商品:" + goodsFuture.get());} catch (Exception e) {throw new RuntimeException(e);}try {log.info("顾客:" + customerFuture.get());} catch (Exception e) {throw new RuntimeException(e);}try {log.info("店铺:" + shopFuture.get());} catch (Exception e) {throw new RuntimeException(e);}long endTime = System.currentTimeMillis();log.info("耗时:" + (endTime - startTime));return mallOrder;}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int m matrixSize;int n matrixColSize[0];int flag_col0 false;for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col0 true;}for (int j 1; j < n; j…

Gradle基础学习(七) 认识插件

Gradle构建在一个插件系统上&#xff0c;本身主要由基础设施组成&#xff0c;比如有一个先进的依赖解析引擎&#xff0c;而其他功能则来自插件。 插件是提供额外功能给Gradle构建系统的软件组件。 插件可以被应用到Gradle构建脚本中&#xff0c;以添加新的任务、配置或其他与构…

在Codelab对llama3做Lora Fine tune微调

Unsloth 高效微调大模型的工具&#xff0c;通过Unsloth微调Llama3, Mistral, Gemma 速度提升2-5倍&#xff0c;内存减少70%&#xff01; Codelab 创建一个jupyter notebook 选择 T4 GPU 安装Fine tune 相关的lib %%capture import torch major_version, minor_version torch…

一起深度学习(AlexNet网络)

AlexNet神经网络 代码实现&#xff1a; 代码实现&#xff1a; import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(# 采用了11*11的卷积核来捕捉对象&#xff0c;因为原始输入数据比较大#步幅为4 &#xff0c;可减少输出的高度核宽度。#输出通…

SeetaFace6人脸检测C++代码实现Demo

SeetaFace6包含人脸识别的基本能力&#xff1a;人脸检测、关键点定位、人脸识别&#xff0c;同时增加了活体检测、质量评估、年龄性别估计&#xff0c;并且顺应实际应用需求&#xff0c;开放口罩检测以及口罩佩戴场景下的人脸识别模型。 官网地址&#xff1a;https://github.co…

检测服务器环境,实现快速部署。适用于CRMEB_PRO/多店

运行效果如图&#xff1a; 最近被好多人问&#xff0c;本来运行的好好的&#xff0c;突然swoole就启动不了了。 本工具为爱发电&#xff0c;如果工具正好解决了您的需求。我会很开心 代码如下&#xff1a; """本脚本为爱发电by:网前雨刮器 """…

FreeBSD RISCV 在QEME中实践-网络配置

在前一篇文章中&#xff0c;我们一起进行了FreeBSD RISCV 在QEME中实践 现在&#xff0c;让我们配置好网络吧&#xff01; 先上结论&#xff1a;用默认配置启动即可&#xff0c;网络就加载好了&#xff0c;只是不能ping罢了。因为不能ping&#xff0c;以为网络没通&#xff0…

印度人Torque Minimum 方式的改进

1 局限性分析 印度人Torque Minimum 复现 上一篇文章分析了印度人那篇Torque Minimum文章的方法&#xff0c;他的方法存在一些局限性&#xff1b; 1&#xff1a;第一个就是6次转矩脉动的抑制&#xff0c;导致了较大的电流谐波畸变率&#xff1b; 2&#xff1a;第二个就是6次…

【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day. 目录 1. 整数在内存中的存储1.1 原码、反码、补码1.1 大小端存储1.2.1 字节序分类1.2.2 判断字节序 2. 浮点数在内存中的存储2.1 浮点数的存储形式2.2 浮点数的 “ 存 ”2.2.1 S2.2.2 E2.2.3 F 2.3 浮点数的 “ 取 ”2.3.1 S2.3.2 E、F 3. 浮…

爱普生S2D13V52快速实现车载显示屏高分辨率显示系统

随着时代的发展&#xff0c;汽车驾驶位前中央的显示屏承担的功能也越来越多&#xff0c;从一开始仅仅是显示仪表盘的信息&#xff0c;再到作为显示屏辅助倒车&#xff0c;再到如今和一块平板一样可公认娱乐&#xff0c;显示屏的大小有些时候成为了一辆车够不够好的体现。随着汽…

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

Apache POI入门学习

Apache POI入门学习 官网地址 excel中使用到的类读取excel表格内容表格内容maven依赖方式一测试结果 方式二测试结果 向excel中写入数据方式一方式二方式三测试结果 从 Excel 工作表中的公式单元格读取数据测试结果 Excel 工作表中写入公式单元格从受密码保护的Excel中读取数据…