线程池案例

秒杀

需求

  • 10个礼物20个客户抢
  • 随机10个客户获取礼物,另外10无法获取礼物

任务类

  • 记得给共享资源加锁
public class MyTask implements Runnable{// 礼物列表private  ArrayList<String> gifts ;// 用户名private String username;public MyTask( String username, ArrayList<String> gifts) {this.username = username;this.gifts = gifts;}@Overridepublic void run() {// 模拟网络延迟try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 加锁 锁对象是gifts 保证线程安全synchronized (gifts) {// 抢礼物grabGift();}}// 抢礼物private void grabGift() {if (gifts.isEmpty()) {System.out.println("礼物已经被抢完了," + username + "没有抢到礼物");return;}// 输出礼物信息 随机抢一个System.out.println(username + "抢到了" + gifts.remove((int) (Math.random() * gifts.size()))) ;}}

测试

1、创建线程池
2、执行任务
3、关闭线程池

// 礼物列表 有10个礼物
ArrayList<String> gifts = new ArrayList<String>() {{add("iPhone 12");add("MacBook Pro");add("iPad Pro");add("Apple Watch");add("AirPods Pro");add("HomePod");add("Apple TV");add("Apple Music");add("Apple Arcade");add("Apple Fitness");
}};// 使用线程池 模拟20个用户同时抢礼物
ExecutorService executorService = Executors.newFixedThreadPool(7);
for (int i = 0; i < 20; i++) {executorService.execute(new MyTask("用户" + i, gifts));
}
// 关闭线程池
executorService.shutdown();

结果

在这里插入图片描述

双人取款机

ATM任务类

  • 默认同一个账户id等同于同一个锁对象
  • 取款的时候加锁,去完款就解锁
public class ATMTask implements Runnable{private String accountId;private double amount;private static Map<String, Double> balanceMap = new HashMap<>();private static final Map<String, Object> lockMap = new ConcurrentHashMap<>();static {balanceMap.put("1", 1000.0);balanceMap.put("2", 1000.0);}public ATMTask(String accountId, double amount) {this.accountId = accountId;this.amount = amount;}private double getBalance(String accountId) {return balanceMap.get(accountId);}private void updateBalance(String accountId, double amount) {if (getBalance(accountId) < amount) {System.out.println("账户余额不足");return;} else {System.out.println("用户" + accountId + "取款成功,取款金额:" + amount);balanceMap.put(accountId, getBalance(accountId) - amount);// 移除锁对象lockMap.remove(accountId);}}/*** 这个方法接受一个账户ID作为参数,* 然后检查lockMap中是否已经存在对应该账户ID的锁对象。* 如果不存在,它会使用putIfAbsent方法添加一个新的锁对象到lockMap中。* 这个方法最终返回账户ID对应的锁对象。* 这种方式确保了每个账户ID都有一个唯一的锁对象,而且这个过程是线程安全的。* @param accountId 账户ID* @return*/private static Object getLock(String accountId) {// 如果不存在则添加lockMap.putIfAbsent(accountId, new Object());// 如果存在则返回return lockMap.get(accountId);}@Overridepublic void run() {synchronized (getLock(this.accountId)) {updateBalance(accountId, amount);}}
}

线程池模拟

    public static void main(String[] args) {// 两个线程对同一个账户取款ATMTask task1 = new ATMTask("1", 800);ATMTask task2 = new ATMTask("1", 800);ATMTask task3 = new ATMTask("2", 700);ATMTask task4 = new ATMTask("2", 300);// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(2);// 提交任务executor.submit(task1);executor.submit(task2);executor.submit(task3);executor.submit(task4);// 关闭线程池executor.shutdown();}

结果

在这里插入图片描述

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

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

相关文章

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

Spring Cloud 引入

1.单体架构&#xff1a; 定义&#xff1a;所有的功能实现都打包成一个项目 带来的后果&#xff1a; ①后端服务器的压力越来越大&#xff0c;负载越来越高&#xff0c;甚至出现无法访问的情况 ②业务越来越复杂&#xff0c;为了满足用户的需求&#xff0c;单体应用也会越来越…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分&#xff0c;见图1&#xff1a; 第61部分&#xff1a;对象标识系统第62部分&#xff1a;接口类第53部分&#xff1a;COSEM应用层第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;协…

HNU小学期BSP软件编程基础十道测试题

http://t.csdnimg.cn/Yv0R1 文章参考了这位大佬的代码&#xff0c;在他的基础上进行了纠错、完善等处理。 配置 编程前的准备工作按大佬的流程即可&#xff0c;稍有不同的是学习通课程网站的资料里没有头文件的整个压缩包了&#xff0c;但我们可以下载某个BSP版的工程文件&am…

X12端口配置指南:ISA ID、测试指示符与997

通过知行之桥EDI系统实现X12 & 标准XML之间的格式转换时&#xff0c;需要完善交换头ISA ID及其限定符、测试标识符以及997的相关配置。 在X12文件中有两组EDI ID对&#xff0c;分别是发送方 ID 限定符 及发送方ID &#xff0c;接收方 ID 限定符及接收方ID。 比如&#xf…

谷粒商城-个人笔记(集群部署篇三)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【linux服务器篇】-Redis-RDM远程连接redis

redis desktop manager 使用远程连接工具RDM连接redis 市面上比较常见的其中一款工具redis desktop manager 简单的说&#xff1a; Redis Desktop Manager 简单的来讲就是Redis可视化工具&#xff0c;可以让我们看到Redis中存储的内容。 redis desktop manager是一款功能强…

C++:多态(继承)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;多态》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :maple_leaf:多态的概念:maple_leaf:继承中的多态1.:leaves:虚函数表 :…

uniapp安卓端实现语音合成播报

最初尝试使用讯飞语音合成方式,能获取到语音数据,但是数据是base64格式的,在安卓端无法播放,网上有说通过转成blob格式的url可以播放,但是uniapp不支持转换的api;于是后面又想其他办法,使用安卓插件播报原生安卓语音播报插件 - DCloud 插件市场 方案一(讯飞语音合成) 1.在讯飞…

C语言入门基础题:奇偶 ASCII 值判断(C语言版)和ASCII码表,什么是ASCII码,它的特点和应用?

1.题目描述&#xff1a; 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES &#xff0c;否则&#xff0c;输出 NO例如&#xff0c;字符 A 的 ASCI 值是 65 &#xff0c;则输出 YES &#xff0c;若输入字符 B(ASCII 值是 66)&#xff…

使用 Qt 和 ECharts 进行数据可视化

文章目录 示例图表预览折线图散点图柱状图使用 Qt 和 ECharts 进行数据可视化一、准备工作1. 安装 Qt2. 准备 ECharts二、在 Qt 中使用 ECharts1. 创建 Qt 项目2. 配置项目文件3. 在 UI 中添加 WebEngineView4. 加载 ECharts三、创建折线图、散点图和柱状图1. 折线图2. 散点图3…

构造二进制字符串

目录 LeetCode3221 生成不含相邻零的二进制字符串 #include <iostream> #include <vector> using namespace std;void dfs(string s,int n,vector<string>& res){if(s.size()n){res.push_back(s);return;}dfs(s"0",n,res);dfs(s"1"…

阿里发布大模型发布图结构长文本处理智能体,超越GPT-4-128k

随着大语言模型的发展&#xff0c;处理长文本的能力成为了一个重要挑战。虽然有许多方法试图解决这个问题&#xff0c;但都存在不同程度的局限性。最近&#xff0c;阿里巴巴的研究团队提出了一个名为GraphReader的新方法&#xff0c;通过将长文本组织成图结构&#xff0c;并利用…

Hi3861鸿蒙开发环境搭建

1.1 安装配置Visual Studio Code 打开Download Visual Studio Code - Mac, Linux, Windows选择下载安装Windows系统的Visual Studio Code。 下载后进行安装。Visual Studio Code安装完成后&#xff0c;通过内置的插件市场搜索并安装开发所需的插件如图所示&#xff1a; 1.2 安…

职场必看:如何用AI打造完美简历和面试准备

如何用AI打造完美简历和面试准备 1. 未来简历AI平台:开启个性化简历制作 想要在职场上留下深刻印象?首先,你需要一份出色的简历。未来简历AI平台让你通过简单的扫码和输入信息,快速开始简历制作。 2. 简历模板:选择适合你的岗位模板 面对众多简历模板,如何挑选?平…

符号同步、定时同步和载波同步

符号同步、定时同步和载波同步是通信系统中重要的同步技术&#xff0c;它们各自承担着不同的功能和作用。以下是对这三种同步技术的详细解释&#xff1a; 符号同步 定义&#xff1a; 符号同步&#xff0c;也称为定时恢复或时钟恢复&#xff0c;是指在数字通信系统中&#xff…

三相感应电机的建模仿真(3)基于ABC相坐标系Level2 S-Fun以及定子串不对称电抗起动过程仿真分析

1. 概述 2. 三相感应电动机状态方程式 3. 基于Level2 S-Function的仿真模型建立 4. 动态分析实例 5. 总结 6. 参考文献 1. 概述 三相感应电机自然坐标系下的数学模型是一组周期性变系数微分方程(其电感矩阵是转子位置角的函数,转子位置角随时间按正弦规律变化),将其用…

后端登录校验——Filter过滤器和Interceptor拦截器

一、Filter过滤器 前面我们学会了最先进的会话跟踪技术jwt令牌&#xff0c;那么我们要让用户使用某些功能时就要根据jwt令牌来验证用户身份&#xff0c;来决定他是否登陆了、让不让用户访问这个页面&#xff08;或功能&#xff09; 但是这样一来&#xff0c;没发一个请求&…

自动化测试之unittest框架详解

1、什么是Unittest框架&#xff1f; python自带一种单元测试框架 2、为什么使用UnitTest框架&#xff1f; >批量执行用例 >提供丰富的断言知识 >可以生成报告 3、核心要素 1).TestCase&#xff08;测试用例&#xff09; 2).TestSuite(测试套件) 3).Test…

Python采集京东标题,店铺,销量,价格,SKU,评论,图片

京东的许多数据是通过 JavaScript 动态加载的&#xff0c;包括销量、价格、评论和评论时间等信息。我们无法仅通过传统的静态网页爬取方法获取到这些数据。需要使用到如 Selenium 或 Pyppeteer 等能够模拟浏览器行为的工具。 另外&#xff0c;京东的评论系统是独立的一个系统&a…