線程池案例

秒殺

需求

  • 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://www.pswp.cn/web/42619.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42619.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42619.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android Dialog全屏沉浸式狀態欄實現

在Android中&#xff0c;創建沉浸式狀態欄通常意味著讓狀態欄背景與應用的主題顏色一致&#xff0c;并且讓對話框在狀態欄下面顯示&#xff0c;而不是浮動。為了實現這一點&#xff0c;你可以使用以下代碼片段&#xff1a; 1、實際效果圖&#xff1a; 2、代碼實現&#xff1a;…

揭秘GPT-4o:未來智能的曙光

引言 近年來&#xff0c;人工智能&#xff08;AI&#xff09;的發展突飛猛進&#xff0c;尤其是自然語言處理&#xff08;NLP&#xff09;領域的進步&#xff0c;更是引人注目。在這一背景下&#xff0c;OpenAI發布的GPT系列模型成為了焦點。本文將詳細探討最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿趙。 上一篇的結束時&#xff0c;海面效果已經做成這樣了&#xff1a; 這個Shader的復雜程度已經比較高了&#xff1a; 不過還有一些美中不足的地方。 1、 海平面沒有反射到天空球 2、 在近岸邊看得到水底的部分&#xff0c;水…

JVM調優:深入理解與實戰指南

引言 Java虛擬機&#xff08;JVM&#xff09;作為Java應用程序的運行環境&#xff0c;其性能直接影響到應用程序的響應速度、吞吐量和穩定性。JVM調優是Java開發者必須掌握的一項關鍵技能&#xff0c;它能夠幫助我們更好地利用系統資源&#xff0c;提升應用程序的性能。本文將…

一些關于C++的基礎知識

引言&#xff1a;C兼容C的大部分內容&#xff0c;但其中仍有許多小細節的東西需要大家注意 一.C的第一個程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看這個是否感覺一頭霧水…

數據挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是畫圖&#xff0c;lib即library&#xff0c;顧名思義&#xff0c;matplotlib是python專門用于開發2D圖表的第三方庫&#xff0c;使用之前需要下載該庫&#xff0c;使用pip命令即可下載。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中啟用和使用SQL功能

?博主首頁 &#xff1a; 「碼到三十五」 &#xff0c;同名公眾號 :「碼到三十五」&#xff0c;wx號 : 「liwu0213」 ?博主專欄 &#xff1a; <mysql高手> <elasticsearch高手> <源碼解讀> <java核心> <面試攻關> ?博主的話 &#xff1a…

服務注冊Eureka

目錄 一、背景 1、概念 2、CAP 理論 3、常見的注冊中心 二、Eureka 三、搭建 Eureka Server 1、搭建注冊中心 四、服務注冊 五、服務發現 六、Eureka 和 Zooper 的區別 一、背景 1、概念 遠程調用就類似于一種通信 例如&#xff1a;當游客與景區之間進行通信&…

代碼隨想錄算法訓練營第六十三天 | prim算法、kruskal算法、復習

53. 尋寶 — prim算法 題目鏈接&#xff1a;https://kamacoder.com/problempage.php?pid1053 文檔講解&#xff1a;https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html 思路 本題是最小生成樹的模板題&#xff0c;最小生成樹可以使用 prim算法&#xf…

bash shell 重定向輸入和輸出

shell 提供的重定向操作符 操作符作用>將命令的輸出發到一個文件中如果文件存在&#xff0c;則新的文件數據會覆蓋已經存在的文件>>將命令的輸出追加到一有文件如果文件不存在&#xff0c;則創建新的文件<將文件內容重定向到命令<<內聯輸入重定向(inline in…

Xubuntu24.04之設置高性能模式兩種方式(二百六十一)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優質專欄:Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄:多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+AOSP…

蒼穹外賣--新增員工

代碼開發 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各個版本維護時間

Springboot各個版本維護時間

MQTT教程--服務器使用EMQX和客戶端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一種輕量級、基于發布-訂閱模式的消息傳輸協議&#xff0c;適用于資源受限的設備和低帶寬、高延遲或不穩定的網絡環境。它在物聯網應用中廣受歡迎&#xff0c;能夠實現傳感器、執行器和其它設備…

【Linux】shell基礎知識點(updating)

1.輸出重定向2.多命令批量執行&#xff08;; 、&&、 ||&#xff09;3.腳本不同方式執行的區別&#xff08;source、bash、sh、./&#xff09;4.理解環境變量5.export6.引號的使用last.命令相關 1.輸出重定向 3種數據流&#xff1a; stdin&#xff1a;標準輸入&#xf…

jmeter持續學習之----性能初級一些概念和指標

服務端為什么要進行性能測試 大量用戶下&#xff0c;系統能否穩定運行&#xff08;比較多&#xff09; 用于硬件服務器的選型 用于軟件技術的選型 性能測試關注的點 用戶角度:響應時間 資源占用:并發用戶數,TPS,資源占用(cpu,內存,JVM) 性能測試策略 基準測試:單用戶測試,對…

去了字節跳動,才知道年薪40W的測試有這么多?

最近脈脈職言區有一條討論火了&#xff1a; 哪家互聯網公司薪資最‘厲害’&#xff1f; 下面的評論多為字節跳動&#xff0c;還炸出了很多年薪40W的測試工程師 我只想問一句&#xff0c;現在的測試都這么有錢了嗎&#xff1f; 前幾天還有朋友說&#xff0c;從騰訊跳槽去了字節&…

8.8.8.8 IP地址的作用

在跟著韋東山老師的學習手冊中看見了關于8.8.8.8 IP用于檢測網絡狀態&#xff0c;然后搜索了關于此IP的相關作用如下&#xff1a; 公共DNS服務&#xff1a;8.8.8.8是Google提供的兩個公共DNS服務器地址之一&#xff08;另一個是8.8.4.4&#xff09;。DNS&#xff08;域名系統&a…

代碼隨想錄訓練營第三十天 452用最少數量的箭引爆氣球 435無重疊區間 763劃分字母區間

第一題&#xff1a; 原題鏈接&#xff1a;452. 用最少數量的箭引爆氣球 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;先根據每個元素的第一個值進行排序&#xff0c;然后從第一個元素開始遍歷&#xff0c;這里要注意我們初始化結果值的時候直接初始化為1&#x…

強化基石,引領未來:完善配套設施與提升服務水平

完善配套設施與提升服務水平對于產業園運營具有重要意義。它們不僅能夠提升園區的硬件環境和整體形象&#xff0c;增強園區的吸引力和競爭力&#xff1b;還能夠優化營商環境&#xff0c;降低企業運營成本&#xff0c;提高運營效率&#xff1b;同時推動園區創新&#xff0c;形成…