java基于數組實現隊列(四)

概述

實現我上一篇博客中提到的
概述
實際上,就是用synchronized代碼塊解決線程安全問題,以及利用wait()、notify()實現線程阻塞、喚醒。

實現

pollV3()

	private Object lockBySynchronized=new Object();
	public int pollV3() {synchronized (lockBySynchronized){ //synchronized代碼塊解決線程安全問題 while (tail == 0) { // 沒有元素try {lockBySynchronized.wait(); // 讓出隊元素的線程阻塞 直到被其他線程喚醒} catch (InterruptedException e) {log.info("等待隊列有元素的過程中被打斷",e);}}int polled = arr[0]; // 隊頭元素log.info("出隊成功,隊頭元素為:{}",polled);System.arraycopy(arr,1,arr,0,tail-1);tail--; // 出隊后 tail往前移動一位lockBySynchronized.notify();return polled;}}

offerV3()

	public void offerV3(int value) {synchronized (lockBySynchronized){while (tail == capacity) {try {lockBySynchronized.wait(); // 當前線程阻塞直到被喚醒或打斷(其他線程調用signal方法,并且喚醒的線程剛好是該線程或其他線程調用signalAll方法) 關聯該condition的鎖會被自動釋放} catch (InterruptedException e) {log.info("被打斷了...");}}arr[tail] = value;log.info("元素 {}入隊成功",value);tail++;lockBySynchronized.notify(); // 喚醒要出隊元素的線程 執行出隊元素的邏輯}}

測試用例

	public static void main(String[] args) throws InterruptedException {ArrayQueue queue = new ArrayQueue(3);Thread t1 = new Thread(() -> {queue.offerV3(1);queue.offerV3(2);}, "t1");Thread t2 = new Thread(() -> {queue.offerV3(3);}, "t2");Thread t3 = new Thread(() -> {queue.offerV3(4);}, "t3");t1.start();t2.start();t3.start();//25ms以后執行一次出隊操作 由于發生了出隊操作 入隊操作就應該可以成功log.info("5s以后執行一次出隊操作");TimeUnit.SECONDS.sleep(5);int polled = queue.pollV3();log.info("出隊的元素:{}",polled);// t1 t2 t3 3個線程的代碼都執行完后再遍歷隊列t1.join();t2.join();t3.join();queue.print();}

測試用例輸出

測試用例輸出

最后

這篇博客應該就是基于數組實現隊列的最后一篇了吧。

好了,如果對你有幫助的話,歡迎點個免費的贊哦。

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

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

相關文章

linux -對文件描述符的操作dup、fcntl有五種

dup #include<unistd.h> int dup(int oldfd);作用&#xff1a;復制一個新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt從空閑的文件描述符表中找一個最小的作為新的拷貝的文件描述符返回&#xff1a;成功返回新的文件描述符&#xff0c;失敗…

DeepSeek各模型現有版本對比分析

文章目錄 一、基礎模型系列&#xff1a;V1 到 V3 的演進二、專用模型系列&#xff1a;推理與多模態三、版本選型與商業化趨勢 DeepSeek作為最近特別火爆的模型&#xff0c;本文將對DeepSeek現有的主要版本進行對比分析,涵蓋參數規模、訓練數據、功能改進、應用場景和性能表現等…

深入解析:在Spring Boot中集成MyBatis Plus實現高效數據庫操作

前后端微服務商城項目&#xff0c;手把手教學&#xff01; 在Spring Boot中集成第三方框架&#xff0c;實際上是非常常見的一種做法。Spring Boot自帶了很多開箱即用的功能&#xff0c;但在實際項目開發中&#xff0c;我們經常需要借助一些第三方框架來實現更為復雜的功能。比如…

現場可以通過手機或者pad實時拍照上傳到大屏幕的照片墻現場大屏電子照片墻功能

現場可以通過手機或者pad實時拍照上傳到大屏幕的照片墻現場大屏電子照片墻功能&#xff0c;每個人都可以通過手機實時拍照上傳到大屏幕上,同時還可以發布留言內容&#xff0c;屏幕上會同步滾動播放展示所有人的照片和留言。相比校傳統的照片直播功能更加靈活方便&#xff0c;而…

項目管理工具Jira在營銷工作管理中的應用與實踐

本文由Atlassian全球白金合作伙伴-龍智編輯整理。 市場營銷人員是維系組織團結的粘合劑。作為公司中最具協作精神的團隊之一&#xff0c;他們確保每個人目標一致&#xff0c;并專注于客戶真正的需求。他們擅長溝通協作&#xff0c;積極響應客戶訴求及塑造品牌方向&#xff0c;…

grafana 忘記登陸密碼

重置 Grafana 登錄密碼 通過命令行重置 admin 密碼 # 如果是通過二進制安裝的 Grafana grafana-cli admin reset-admin-password <新密碼>

基于Flask框架的食譜數據可視化分析系統的設計與實現

【Flask】基于Flask框架的食譜數據可視化分析系統的設計與實現 &#xff08;完整系統源碼開發筆記詳細部署教程&#xff09;? 目錄 一、項目簡介二、項目界面展示三、項目視頻展示 一、項目簡介 在當今數字化時代&#xff0c;信息可視化已成為一種高效的數據理解和傳播手段。…

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_array_init 函數

ngx_array_init 定義在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

開源項目 botgroup.chat 介紹 AI 多人聊天室&#xff1a; 一個基于 React 和 Cloudflare Pages(免費一鍵部署) 的多人 AI 聊天應用&#xff0c;支持多個 AI 角色同時參與對話&#xff0c;提供類似群聊的交互體驗。體驗地址&#xff1a;https://botgroup.chat 開源倉庫&#x…

GPU和FPGA的區別

GPU&#xff08;Graphics Processing Unit&#xff0c;圖形處理器&#xff09;和 FPGA&#xff08;Field-Programmable Gate Array&#xff0c;現場可編程門陣列&#xff09;不是同一種硬件。 我的理解是&#xff0c;雖然都可以用于并行計算&#xff0c;但是GPU是純計算的硬件…

詳解單例模式、模板方法及項目和源碼應用

大家好&#xff0c;我是此林。 設計模式為解決特定問題提供了標準化的方法。在項目中合理應用設計模式&#xff0c;可以避免重復解決相同類型的問題&#xff0c;使我們能夠更加專注于具體的業務邏輯&#xff0c;減少重復勞動。設計模式在定義系統結構時通常考慮到未來的擴展。…

高清下載油管視頻到本地

下載工具并安裝: yt-dlp官網地址&#xff1a; GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官網地址&#xff1a; Download FFmpeg 注&#xff1a;記住為其添加環境變量 操作命令&#xff1a; 該指令表示以720p碼率下載VIDEO_UR…

Docker掛載數據顯式掛載和隱式掛載的區別

項目使用的Docker file 創建數據卷掛載點&#xff0c;結果發現宿主機目錄中的數據卷路徑下是空的&#xff0c;才知道docker file中創建的數據卷是隱式掛載&#xff0c;并不會在宿主機上留下持久化數據&#xff0c;隨著容器被刪除隱式掛載的數據卷也會跟著被刪除 后面改為在jen…

IOS UITextField 無法隱藏鍵盤問題

設置UITextField 鍵盤按鈕返回鍵為“完成”&#xff0c;即return key 設置done .m代碼設置代理 //設置代理協議 UITextFieldDelegate&#xff0c; self.mobileTextField.delegate self; ///點擊完成鍵隱藏鍵盤 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…

【深度學習】Unet的基礎介紹

U-Net是一種用于圖像分割的深度學習模型&#xff0c;特別適合醫學影像和其他需要分割細節的任務。如圖&#xff1a; Unet論文原文 為什么叫U-Net&#xff1f; U-Net的結構像字母“U”&#xff0c;所以得名。它的結構由兩個主要部分組成&#xff1a; 下采樣&#xff08;編碼…

RT-Thread+STM32L475VET6實現定時器定時功能

文章目錄 前言一、板載資源介紹二、具體步驟1.打開STM32CubeMX進行相關配置1.1 使用外部高速時鐘&#xff0c;并修改時鐘樹1.2 打開定時器(定時器根據自己需求調整)1.3 打開串口1.4 生成工程 2. 配置定時器2.1 打開HWTIMER設備驅動2.2 聲明定時器2.3將stm32l4xx_hal_msp.c中HAL…

Linux /etc/fstab文件詳解:自動掛載配置指南(中英雙語)

Linux /etc/fstab 文件詳解&#xff1a;自動掛載配置指南 在 Linux 系統中&#xff0c;/etc/fstab&#xff08;File System Table&#xff09;是一個至關重要的配置文件&#xff0c;它用于定義系統開機時自動掛載的文件系統。如果你想讓磁盤分區、遠程存儲&#xff08;如 NFS&…

鏈表-基礎訓練(二)鏈表 day14

兩兩交換鏈表中的節點 題目示意&#xff1a; 給定一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后的鏈表。 你不能只是單純的改變節點內部的值&#xff0c;而是需要實際的進行節點交換。 原先我的思路是圖像上的思路&#xff0c;但是我感覺還是很復雜…

Unity游戲制作中的C#基礎(4)數組聲明和使用

一、數組的聲明 在 C# 中&#xff0c;聲明數組有多種方式&#xff0c;每種方式都有其適用的場景&#xff0c;下面為你逐一詳細介紹&#xff1a; 1. 直接初始化聲明 這種方式直觀且便捷&#xff0c;在聲明數組的同時就為其賦初值&#xff0c;讓數組從誕生之初就擁有了具體的數據…

【Gin-Web】Bluebell社區項目梳理5:投票功能分析與實現

本文目錄 一、投票功能投票流程實現代碼redis投票 一、投票功能 投票流程 首先我們要明確&#xff0c;就是 誰&#xff08;哪個用戶&#xff1a;userID&#xff09; 給 哪個帖子&#xff08;postID&#xff09; 投了 什么票&#xff08;贊成票or反對票&#xff09;。 贊成票…