Java進階——多線程相關,實際應用中的積累,持續更新

在這里插入圖片描述

目錄

  • 多線程相關
    • CountDownLatch
      • 賽跑的案例
      • countDownLatch.await(300, TimeUnit.SECONDS);
  • Java其他進階
    • Map的put方法
    • 只放一個元素的集合


多線程相關

CountDownLatch

案例:主線程的執行需要等待子線程執行完,等各個線程執行完畢后,主線程做收尾的工作

  • 初始化一個:final CountDownLatch latch = new CountDownLatch(3);
  • 線程池中的子線程調用 countDown方法進行減1;
  • 主線程啟動后,等待子線程不斷減1,直到為0后,主線程繼續往下執行;
package com.tianju.myTest;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CountdownLatchTest1 {public static void main(String[] args) {ExecutorService service = Executors.newFixedThreadPool(3);final CountDownLatch latch = new CountDownLatch(3);for (int i = 0; i < 3; i++) {Runnable runnable = new Runnable() {@Overridepublic void run() {try {System. out.println("子線程" + Thread.currentThread().getName() + "開始執行");Thread. sleep((long) (Math. random() * 10000));System. out.println("子線程" + Thread.currentThread().getName() + "執行完成");latch.countDown(); // 當前線程調用此方法,則計數減一} catch (InterruptedException e) {e.printStackTrace();}}};service.execute(runnable);}try {System. out.println("主線程" + Thread.currentThread().getName() + "等待子線程執行完成..." );latch.await(); // 阻塞當前線程,直到計時器的值為0System. out.println("主線程" + Thread.currentThread().getName() + "開始執行...");} catch (InterruptedException e) {e.printStackTrace();}finally {service.shutdown();}}
}

賽跑的案例

案例2:4名選手參加賽跑,選手需要等待裁判發送指令;裁判發送完指令后,需要等所有選手到達終點;所有選手到達終點后,裁判匯總成績。

  • 主線程:裁判發指令,裁判等選手到達終點,到達終點后,匯總成績;
  • 子線程:每個選手需要阻塞在裁判發指令之前,主線程發指令后,子線程繼續運行;此時主線程阻塞,所有子線程結束后,主線程繼續運行

實現的思路

  • 定義兩個CountDownLatch,一個為1,一個為4;
  • CountDownLatch(1),用來控制等待裁判指令,主線程先休眠,讓出資源,讓子線程獲得cpu資源,子線程通過await 阻塞;
  • 主線程休眠結束后,對1進行-1,然后await 4 阻塞,觸發子線程,子線程繼續運行;
  • 子線程在運行過程中對于4 進行-1,等到值為0時,觸發主線程的await 4 阻塞;
  • 主線程繼續運行,裁判進行成績的匯總

在這里插入圖片描述

在這里插入圖片描述

package com.tianju.myTest;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// https://www.cnblogs.com/tstd/p/4987935.html
public class CountdownLatchTest2 {public static void main(String[] args) {ExecutorService service = Executors.newCachedThreadPool();final CountDownLatch cdOrder = new CountDownLatch(1);final CountDownLatch cdAnswer = new CountDownLatch(4);for (int i = 0; i < 4; i++) {Runnable runnable = new Runnable() {public void run() {try {System.out.println("選手" + Thread.currentThread().getName() + "正等待裁判發布口令");cdOrder.await(); // 線程都阻塞在這里等待釋放System.out.println("選手" + Thread.currentThread().getName() + "已接受裁判口令");Thread.sleep((long) (Math. random() * 10000));System.out.println("選手" + Thread.currentThread().getName() + "到達終點");cdAnswer.countDown(); // 進行-1操作,4個線程都在操作CountDownLatchSystem.out.println("cdAnswer---->:"+cdAnswer);} catch (Exception e) {e.printStackTrace();}}};service.execute(runnable);}try {Thread. sleep((long) (Math. random() * 10000));System. out.println("裁判" + Thread.currentThread ().getName() + "即將發布口令" );cdOrder.countDown();System. out.println("裁判" + Thread.currentThread ().getName() + "已發送口令,正在等待所有選手到達終點" );cdAnswer.await();System. out.println("所有選手都到達終點" );System. out.println("裁判" + Thread.currentThread ().getName() + "匯總成績排名" );} catch (Exception e) {e.printStackTrace();}service.shutdown();}
}

countDownLatch.await(300, TimeUnit.SECONDS);

await方法的對比

  • 沒有設置時間,會一直阻塞,直到countdown為0;
  • 設置了時間,在超過這個時間后,解除阻塞,返回false;

線程一直阻塞的情況

在這里插入圖片描述

到達時間后,就解除阻塞,并返回false

在這里插入圖片描述

-1成功,返回true

在這里插入圖片描述

Java其他進階

Map的put方法

  • Map 的 put 方法其實是有返回值的

在這里插入圖片描述

package com.tianju.myTest;import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;/*** hashMap 的 put 方法其實是有返回值的*/
public class ConHashMap {public static void main(String[] args) {ConcurrentHashMap<Object, Object> concurrentHashMap = new ConcurrentHashMap<>();// 如果有了鍵為 pet,還能往里面放concurrentHashMap.put("pet", 567);Object put = concurrentHashMap.put("pet", "task");System.out.println(put);if (put!=null){System.out.println("======== current key used! ========");}System.out.println(concurrentHashMap);HashMap<Object, Object> hashMap = new HashMap<>();hashMap.put("pet", 123);Object pet = hashMap.put("pet", 561);System.out.println(pet);System.out.println(hashMap);}
}

只放一個元素的集合

  • 基于內存或者業務的考慮,有時候集合只放一個元素,可以用collections下面的singleton集合

在這里插入圖片描述

package com.tianju.myTest;import java.util.Collections;
import java.util.List;/*** 只能存放一個元素的 List,不會造成內存空間的浪費*/
public class SingletonListTest {public static void main(String[] args) {String s = "hello, singleton";List<String> list = Collections.singletonList(s);list.add("second element");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160259.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160259.shtml

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

相關文章

redis的高可用(主從復制和哨兵模式)

redis的高可用&#xff08;主從復制和哨兵模式&#xff09; redis的性能管理&#xff1a;redis的數據緩存在內存當中 INFO memory&#xff1a;查看redis內存使用情況 used_memory:1800800&#xff1a;redis中數據占用的內存 used_memory_rss:5783552&#xff1a;redis向操作…

Halcon Solution Guide I basics(3): Region Of Interest(有興趣區域/找重點)

文章目錄 文章專欄前言文章解讀前言創建ROI案例1&#xff1a;直接截取ROI手動截取ROI 總結ROI套路獲取窗口句柄截取ROI區域獲取有效區域 Stop組合 文章專欄 Halcon開發 Halcon學習 練習項目gitee倉庫 CSDN Major 博主Halcon文章推薦 前言 今天來看第三章內容&#xff0c;既然是…

QTableWidget——編輯單元格

文章目錄 前言熟悉QTableWiget&#xff0c;通過實現單元格的合并、拆分、通過編輯界面實現表格內容及屬性的配置、實現表格的粘貼復制功能熟悉QTableWiget的屬性 一、[單元格的合并、拆分](https://blog.csdn.net/qq_15672897/article/details/134476530?spm1001.2014.3001.55…

Docker實踐筆記7:構建MySQL 8鏡像

使用Docker構建MySQL 8鏡像并運行容器 本教程將指導您使用Dockerfile構建和運行一個MySQL 8容器。讓我們開始吧&#xff01; 步驟1&#xff1a;創建Dockerfile 在您的項目根目錄下創建一個名為Dockerfile的文件。以下是Dockerfile的示例內容&#xff1a; # 基于最新的MySQL…

docker、elasticsearch8、springboot3集成備忘

目錄 一、背景 二、安裝docker 三、下載安裝elasticsearch 四、下載安裝elasticsearch-head 五、springboot集成elasticsearch 一、背景 前兩年研究了一段時間elasticsearch&#xff0c;當時也是網上找了很多資料&#xff0c;最后解決個各種問題可以在springboot上運行了…

vue-使用input封裝上傳文件圖片全局組件

前言 實際開發過程中&#xff0c;我們經常遇見需要上傳文件圖片功能&#xff0c;可以封裝一個全局組件來調用 原理很簡單&#xff0c;首先獲取到文件或圖片對象&#xff0c;調用自己公司文檔服務器的接口&#xff0c;上傳文件圖片 為了方便用戶體驗&#xff0c;我們應該在上傳…

Godot

前言 為什么要研究開源引擎 主要原因有&#xff1a; 可以享受“信創”政策的紅利&#xff0c;非常有利于承接政府項目。中美脫鉤背景下&#xff0c;國家提出了“信創”政策。這個政策的核心就是&#xff0c;核心技術上自主可控。涉及的產業包括&#xff1a;芯片、操作系統、數據…

【Django使用】md文檔10大模塊第5期:Django數據庫增刪改查和Django視圖

Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼復用&#xff0c;多個組件可以很方便的以"插件"形式服務于整個框架&#xff0c;Django有許多功能強大的第三方插件&#xff0c;你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展…

Vue項目 配置項設置

一、項目運行時瀏覽器自動打開 找到package.json文件 找到"sctipts"配置項 在"serve"配置項最后加上--open "scripts": {"serve": "vue-cli-service serve --open","build": "vue-cli-service build&quo…

Redis面試內容,Redis過期策略,Redis持久化方式,緩存穿透、緩存擊穿和緩存雪崩,以及解決辦法

文章目錄 一、redis什么是RedisRedis使用場景1、緩存2、數據共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式鎖4、全局ID5、計數器6、限流7、位統計 Redis有5中數據類型&#xff1a; SSHLZRedis中一個key的值每天12點過期&#xff…

Cookie、Session、CBV加裝飾器的三種方法

【0】cookie、session和Token的發展史 【1】Cookie的形式 存儲形式&#xff1a;k&#xff1a;v鍵值對存儲位置&#xff1a;客戶端缺點&#xff1a;不安全&#xff0c;信息可能會泄露 【2】session的形式 標識符&#xff0c;表示我是當前用戶加密出來的數據對敏感信息進行加密…

排序算法-----快速排序(非遞歸實現)

目錄 前言 快速排序 基本思路 非遞歸代碼實現 前言 很久沒跟新數據結構與算法這一欄了&#xff0c;因為數據結構與算法基本上都發布完了&#xff0c;哈哈&#xff0c;那今天我就把前面排序算法那一塊的快速排序完善一下&#xff0c;前面只發布了快速排序遞歸算法&#xff0c;…

單鏈表相關面試題--3.鏈表的中間節點

3.鏈表的中間節點 876. 鏈表的中間結點 - 力扣&#xff08;LeetCode&#xff09; /* 解題思路&#xff1a; 通過快慢指針找到中間節點&#xff0c;快指針每次走兩步&#xff0c;慢指針每次走一步&#xff0c;當快指針走到結尾的時候&#xff0c;慢指針正好走到中間位置 */ typ…

HTTPS協議的加密流程

目錄 一&#xff0c;HTTPS是什么 二&#xff0c;兩種加密方式 三&#xff0c;HTTPS的加密過程 3.1 引入對稱加密 3.2 引入非對稱加密 3.3 引入證書 一&#xff0c;HTTPS是什么 HTTPS也是一個應用層協議&#xff0c;它是在HTTP協議的基礎上引入了一個加密層。因為HTTP協議…

每天一道算法題(十)——獲取和為k的子數組

文章目錄 1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——雙指針 總結 1、問題 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 2、示例 示例 1&#xff1a; 輸入&#x…

多分類自定義采樣比例

多分類自定義采樣比例 import torch from torch.utils.data import DataLoader, Dataset, WeightedRandomSampler from torchvision import transforms from torchvision.datasets import ImageFolder# 假設你有一個自定義的數據集類 class CustomDataset(Dataset):def __init…

51單片機按鍵控制LED燈亮滅的N個玩法

51單片機按鍵控制LED燈亮滅的N個玩法 1.概述 這篇文章介紹按鍵的使用&#xff0c;以及通過控制LED燈的小實驗&#xff0c;發現按鍵中存在的問題&#xff0c;然后思考并解決這些問題。達到熟練使用按鍵控制元器件。 2.搭建硬件環境 1.硬件準備 名稱型號數量單片機STC12C205…

2023全球數字貿易創新大賽9-12

目錄 回答評委提問:先說痛點-再說怎樣解決 食品安全溯源是否全流程 星火? 鏈網

Sleuth

Sleuth 一 引言 隨著服務的越來越多&#xff0c;對調?鏈的分析會越來越復雜。它們之間的調?關系也許如下圖&#xff1a; 問題&#xff1a; 1&#xff1a;微服務之間的調?錯綜復雜&#xff0c;?戶發送的請求經歷那些服務&#xff0c;調?鏈不清楚&#xff0c;沒有? 個?…

【SpringCloud微服務全家桶學習筆記-Hystrix(服務降級,熔斷,接近實時的監控,服務限流等)】

服務雪崩 &#xff08;微服務面臨的問題&#xff09; 多個微服務之間調用的時候&#xff0c;假設微服務A調用微服務B和微服務C&#xff0c;微服務B和微服務C又調用其它的微服務&#xff0c;這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用&…