大聰明教你學Java | 深入淺出聊 Stream.parallel()

前言

🍊作者簡介: 不肯過江東丶,一個來自二線城市的程序員,致力于用“猥瑣”辦法解決繁瑣問題,讓復雜的問題變得通俗易懂。
🍊支持作者: 點贊👍、關注💖、留言💌~

相信各位小伙伴對 Stream 都不陌生,它是 Java 8 及以后版本中引入的一個新特性,用于處理集合數據。Stream 是對集合(Collection)對象功能的增強,與 Lambda 表達式結合,可以提高編程效率、間接性和程序可讀性。Stream API 中為我們提供了很多高效且易用的方法,大聰明的好朋友 —— 大明白就對這些方法情有獨鐘,但是就在前幾天,卻因為他在項目中使用了 Stream.parallel() 而引發了一個小小的意外情況… …

這里賣個關子😝~ 在說大明白引發的意外情況之前,我們先來一起看看什么是Stream.parallel()

Stream.parallel()

Stream.parallel() 方法用于將流操作轉換為并行操作,以便在多個線程上并行執行。并行流是一種可以同時在多個線程上執行操作的流,它將流的元素分割成多個子集,每個子集在不同的線程上獨立處理,最后將結果合并。使用 parallel() 方法可以輕松開啟并行流處理模式,無需顯式管理線程和同步。

List<Integer> numbers = ...; // 假設這里有一個包含大量正整數的List集合numbers.stream() // 創建順序流.parallel() // 轉換為并行流.filter(n -> n % 2 == 0) // 并行流操作 - 過濾List集合中的偶數.map(n -> n * 2) // 并行流操作 - 將過濾出來的偶數×2.forEach(System.out::println); // 并行流操作 - 打印結果

在上面的示例中,parallel() 方法將順序流轉換為并行流,后續的 filter()、map() 和 forEach() 操作將在多個線程上并行執行,從而加速數據處理。我們下面再看看它的底層原理👇

當調用 Stream.parallel() 方法時,它實際上會返回一個新的并行流對象,這個流對象可以在多個線程上并行執行流操作。下面是 Stream.parallel() 方法的大致工作原理:
① 并行流的劃分和分治:當我們對并行流進行操作時,Java 會使用 Fork/Join 框架將數據劃分成多個小任務,并將這些小任務分配給多個線程來并行執行。這個過程涉及到遞歸地將大任務分解為小任務,直到小任務足夠簡單可以直接求解。
② 工作竊取(Work Stealing):Fork/Join 框架采用工作竊取算法來實現任務的調度和執行。在工作竊取的過程中,空閑的線程會主動去其他線程的任務隊列中竊取任務執行。這種方式能夠充分利用線程資源,提高并行處理的效率。
③合并結果:在并行流的操作中,各個線程會并行地對數據進行處理,最后需要將各個線程的處理結果進行合并,得到最終的結果。這一過程涉及到結果的收集和合并,確保最終的結果是完整且正確的。

這里我們又引申出了一個新的概念 —— Fork/Join 框架。Fork/Join 框架是 Java 7 中引入的用于支持并行計算的框架,是一種并行計算模式,用于解決可以被分解成更小的可并行任務的問題。該模式包含兩個關鍵操作:Fork(分解)和Join(合并)。在 Fork/Join 模式中,原始問題被遞歸地分解為更小的子問題,直到達到可以并行解決的最小單位。這個過程被稱為 Fork。每個子問題可以獨立地在不同的處理器上執行,并行地求解部分問題。 一旦所有的子問題都被解決,就會進行 Join 操作。Join 操作將所有子問題的結果合并為最終的解決方案。這種分解和合并的過程可以視為樹形結構,其中每個節點代表一個子問題。

Fork/Join 模式最適用于可以自然地分解為多個獨立子問題的計算密集型任務。它適用于多核處理器或并行計算環境,其中可以充分利用并行性。Java 平臺提供了 Fork/Join 框架,用于實現該模式。它包括了一個線程池(ForkJoinPool)任務(ForkJoinTask) 的概念。任務可以是可分解的子問題,也可以是執行最終計算的任務。通過 ForkJoinPool,可以將任務提交給線程池執行,自動實現任務的分解和合并過程。Fork/Join 模式的優點在于它能夠充分利用多核處理器的并行性,提高計算效率。

📌 在這里我們就先對 Fork/Join 框架做一個簡單的介紹,后續大聰明會單獨出一篇博客對 Fork/Join 框架進行詳細的介紹。

咱們言歸正傳,有些小伙伴看到“線程池(ForkJoinPool)”的時候可能就已經猜測到大明白遇倒的意外情況和線程有關系了。Stream.parallel() 并行流默認使用的是 ForkJoinPool.commonPool() 作為線程池,該線程池默認最大線程數就是 CPU 核數。正是因為大明白對并行流操作的原理不清楚,他在沒有配置線程池的情況下,通過并行流做了數據庫的大量批量更新操作,于是最大線程數只有 CPU 核數,最終導致在批量更新的時候出現了線程阻塞的情況,從而出現了這個小小的意外。

通過這件事應該也可以給各位小伙伴提個醒,在實際使用時需要慎重考慮并行化帶來的影響,并確保線程安全性和并發性。

① 線程安全:并行流并不能保證線程安全性,因此,如果流中的元素是共享資源或操作本身不是線程安全的,你需要確保正確同步或使用線程安全的數據結構。
② 資源消耗:并行流默認使用的線程池大小可能與機器的實際物理核心數相適應,但也可能與其他并發任務爭奪系統資源。
③ 結果一致性:并行流并不保證執行的順序性,也就是說,如果流操作的結果依賴于元素的處理順序,則不應該使用并行流。
④ 事務處理:在涉及到事務操作時,通常需要避免在并行流中直接處理,如上述例子所示,應當將事務邊界放在單獨的服務方法內,確保每個線程內的事務獨立完成。

小結

本人經驗有限,有些地方可能講的沒有特別到位,如果您在閱讀的時候想到了什么問題,歡迎在評論區留言,我們后續再一一探討🙇?

希望各位小伙伴動動自己可愛的小手,來一波點贊+關注 (????) 讓更多小伙伴看到這篇文章~ 蟹蟹呦(●’?’●)

如果文章中有錯誤,歡迎大家留言指正;若您有更好、更獨到的理解,歡迎您在留言區留下您的寶貴想法。

你在被打擊時,記起你的珍貴,抵抗惡意;
你在迷茫時,堅信你的珍貴,拋開蜚語;
愛你所愛 行你所行 聽從你心 無問東西

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

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

相關文章

MySQL學習——選項文件的使用

MySQL 的許多程序都可以從選項文件&#xff08;有時也被稱為配置文件&#xff09;中讀取啟動選項。選項文件提供了一種方便的方式來指定常用的選項&#xff0c;這樣你就不必每次運行程序時都在命令行上輸入這些選項。 要確定一個程序是否讀取選項文件&#xff0c;你可以使用 -…

man命令的作用

man命令是Linux操作系統中一個非常實用的命令&#xff0c;它用于查看命令的手冊頁面&#xff0c;幫助用戶了解特定命令的用法、選項和參數。這不僅對新用戶在學習如何使用新命令時很有幫助&#xff0c;也方便了經驗豐富的用戶快速查找命令的詳細信息。以下是具體介紹&#xff1…

[論文精讀]Supervised Community Detection with Line Graph Neural Networks

論文網址:[1705.08415] Supervised Community Detection with Line Graph Neural Networks (arxiv.org) 英文是純手打的!論文原文的summarizing and paraphrasing。可能會出現難以避免的拼寫錯誤和語法錯誤,若有發現歡迎評論指正!文章偏向于筆記,謹慎食用 ?內涵大量可視…

高速模擬信號鏈的設計學習

目錄 概述&#xff1a; 定義&#xff1a; 斷開&#xff1a; 鏈路設計&#xff1a; 結論&#xff1a; 概述&#xff1a; 由于對共模參數及其與設備之間的關聯缺乏了解&#xff0c;客戶仍然會提出許多技術支持問題。ADC數據表指定了模擬輸入的共模電壓要求。關于這方面沒有太…

jenkins應用2

1.jenkins應用 1.jenkins構建的流程 1.使用git參數化構建&#xff0c;用標簽區分版本 2.git 拉取gitlab遠程倉庫代碼 3.maven打包項目 4.sonarqube經行代碼質量檢測 5.自定義制作鏡像發送到遠程倉庫harbor 6.在遠程服務器上拉取代碼啟動容器 這個是構建的整個過程和步驟…

C# 反射類Assembly 程序集(Assembly)用法

常見的兩種程序集&#xff1a; 可執行文件&#xff08;.exe文件&#xff09;和 類庫文件&#xff08;.dll文件&#xff09;。 在VS開發環境中&#xff0c;一個解決方案可以包含多個項目&#xff0c;而每個項目就是一個程序集。 他們之間是一種從屬關系&#xff0c;也就是說&…

java —— 匿名內部類與 Lambda 表達式

一、匿名內部類 匿名內部類是一種沒有名稱的類&#xff0c;多用于只使用一次的情況&#xff0c;本質上就是其所繼承的父類或接口的一個子類。 &#xff08;一&#xff09;繼承普通類的情況 public class Test{public void method(){System.out.println("通用方法"…

Python與Android連接:深入探索與實現

Python與Android連接&#xff1a;深入探索與實現 在現代移動應用開發領域&#xff0c;Python和Android的結合使用為開發者帶來了無限的可能性。這種跨平臺的組合不僅拓寬了開發者的視野&#xff0c;也極大地提升了應用的靈活性和可擴展性。本文將從四個方面、五個方面、六個方…

【NLP開發】Python實現聊天機器人(微信機器人)

&#x1f37a;NLP開發系列相關文章編寫如下&#x1f37a;&#xff1a;1&#x1f388;【小沐學NLP】Python實現詞云圖&#x1f388;2&#x1f388;【小沐學NLP】Python實現圖片文字識別&#x1f388;3&#x1f388;【小沐學NLP】Python實現中文、英文分詞&#x1f388;4&#x1…

轉讓北京電力施工總承包二級資質變更條件和流程

在電力工程領域&#xff0c;資質等級是企業能否參與競標、承接工程的重要標志之一。北京電力工程總包二級資質的轉讓&#xff0c;是指已經取得該資質的企業將其資質轉讓給需要的企業。這種轉讓是基于合作與共贏的原則&#xff0c;旨在推動電力工程行業健康、穩定發展&#xff0…

記錄使用自定義編輯器做試題識別功能

習慣了將解析寫在代碼注釋&#xff0c;這里就直接上代碼啦&#xff0c;里面用到的bxm-ui3組件庫是博主基于element-Plus做的&#xff0c;可以通過npm i bxm-ui3自行安裝使用 // 識別方法&#xff1a; // dom 當前識別數據所在區域, questionType 當前點擊編輯選擇的題目類型&a…

力扣刷題--LCR 135. 報數【簡單】

題目描述 實現一個十進制數字報數程序&#xff0c;請按照數字從小到大的順序返回一個整數數列&#xff0c;該數列從數字 1 開始&#xff0c;到最大的正整數 cnt 位數字結束。 示例 1: 輸入&#xff1a;cnt 2 輸出&#xff1a;[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,1…

codeblock怎么編程:從入門到精通的全面指南

codeblock怎么編程&#xff1a;從入門到精通的全面指南 在數字化時代&#xff0c;編程已成為一項不可或缺的技能。Code::Blocks作為一款流行的開源集成開發環境&#xff08;IDE&#xff09;&#xff0c;為初學者和有經驗的開發者提供了強大的編程支持。那么&#xff0c;codebl…

C是結構化編程語言嗎:深度剖析與多維度解讀

C是結構化編程語言嗎&#xff1a;深度剖析與多維度解讀 在編程語言的浩瀚海洋中&#xff0c;C語言以其獨特的魅力占據著重要的地位。那么&#xff0c;C語言是否可以被歸類為結構化編程語言呢&#xff1f;這是一個值得深入探討的問題。本文將從四個方面、五個方面、六個方面和七…

Qt | Qt 資源簡介(rcc、qmake)

1、資源系統是一種獨立于平臺的機制,用于在應用程序的可執行文件中存儲二進制文件(前面所討論的數據都存儲在外部設備中)。若應用程序始終需要一組特定的文件(比如圖標),則非常有用。 2、資源系統基于 qmake,rcc(Qt 的資源編譯器,用于把資源轉換為 C++代碼)和 QFile …

java—MyBatis框架

簡介 什么是 MyBatis&#xff1f; MyBatis 是一款優秀的持久層框架&#xff0c;它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO&…

軟件公司為什么必須要使用低代碼系統?

在當今軟件行業全國比較內卷的大環境下&#xff0c;軟件公司面臨著前所未有的挑戰。為了在這個競爭激烈的市場中生存并脫穎而出&#xff0c;馳騁低代碼設計者認為&#xff0c;軟件公司必須要使用低代碼系統。以下是幾個關鍵的原因&#xff1a; 時代發展的必然選擇 低代碼系統是…

領導力中的說服藝術

本文主要介紹了亞里士多德修辭三角理論&#xff0c;即演講者在說服聽眾時如何運用品格&#xff08;Ethos&#xff09;、情感&#xff08;Pathos&#xff09;和邏輯&#xff08;Logos&#xff09;三種基本的修辭手法。原文: The Art of Persuasion in Leadership 亞里士多德的說…

Kubernetes面試題分享

目錄 前言 1.Kubernetes的控制平面包括哪些核心組件&#xff1f;它們各自的作用是什么&#xff1f; 2.Kubernetes的數據平面涉及哪些組件&#xff1f;它們如何協作&#xff1f; 3.什么是Pod&#xff1f;為什么它是Kubernetes的基本單元&#xff1f; 4.Service如何實現服務…

【自動駕駛技術】自動駕駛汽車AI芯片匯總——地平線篇

0. 前言 按照國際慣例&#xff0c;首先聲明&#xff1a;本文只是我自己學習的理解&#xff0c;雖然參考了他人的寶貴見解及成果&#xff0c;但是內容可能存在不準確的地方。如果發現文中錯誤&#xff0c;希望批評指正&#xff0c;共同進步。 本篇文章是這個系列的第二篇&#x…