Java 異步編程——為什么要使用多線程,以及在什么情況下使用多線程?

前言

單線程就是一個工人在搬磚,多線程就是多個工人在搬磚;在相同數量的磚要搬的情況下,多個工人搬磚肯定比一個人搬的快。

那多個工人做事一定比一個工人做事快嗎?那不一定,不過大多數情況下是的。多線程只是可以同時接收多個任務,但不一定馬上去執行任務。這里要看有多少資源(單核 or 多核)和做什么任務(計算密集型任務 or IO密集型任務)。基于這兩個條件進行笛卡爾積形成的場景來分析單線程和多線程的工作效率。

單核:單核處理器指的是只有一個物理核心的處理器。物理核心是處理器中的實際計算單元,能夠執行指令和處理數據。在單核處理器中,只能同時執行一個線程或進程。即使使用多線程編程,也只能通過時間片輪轉的方式在不同線程之間進行切換,每個線程在某個時間片內獨占處理器的執行時間。

多核:多核處理器指的是具有多個物理核心的處理器。多核處理器將多個物理核心集成到一個芯片上,每個核心都是一個獨立的計算單元,能夠并行執行指令和處理數據。每個核心可以獨立地執行一個線程或進程,因此多核處理器可以同時執行多個線程或進程,提供更高的并行處理能力。

計算密集型任務:計算密集型任務是指那些主要依賴 CPU 運算能力的任務。通常涉及大量的數值計算、復雜的算法或模型運算,而對于 I/O 操作的需求相對較低,受限于 CPU 的運算速度。
IO密集型任務:I/O 密集型任務是指那些主要依賴于輸入/輸出操作的任務。這些任務通常需要頻繁地進行文件讀寫、網絡通信、數據庫訪問等 I/O 操作,而對于 CPU 的計算能力需求相對較低。

單核 + 計算密集型任務:

在單核情況下,只有一個物理核心處理器,多線程和單線程最終都落在一個核心處理器(CPU)去處理任務,此時的多線程只是分時段的獲取同一個CPU處理任務。就好比工人使用一個計算器來記賬,最終都依靠計算器計算加減乘除來獲得結果。

在處理計算密集型任務的時候,主要依賴CPU不停的運算來處理任務,這個時候無論是多線程還是單線程,接收單個或多個計算密集型任務,處理效率都沒太大差距,因為只有一個CPU在不停地進行運算處理任務,接收的多個任務也只能一個個依次處理。就好比多個工人都在做記賬任務,而計算器只有一個,需要等一個工人使用計算完后才能交給下一個工人記賬,這個時候一個工人記多筆賬還是多個工人分別記,都沒太大差別,甚至還差一點,工人之間需要交換計算器會產生耗時,這就是多線程之間的切換開銷。

單核+計算密集型任務場景時,使用單線程處理就可以了。

單核 + IO密集型任務:

在處理IO密集型任務的時候,雖然多線程和單線程最終都落在一個核心處理器(CPU)去處理任務,但在處理一個任務的整個過程中,CPU并不需要一直參與運算,此時多線程就可以充分利用CPU。對于單線程,在處理一個任務的整個過程中,只有需要運算的時候CPU才參與運算,其它時候CPU就在空轉,一直到線程處理完;對于多線程,一個線程處理任務過程中,在需要運算時使用CPU運算,其它時候就不占用(異步執行IO操作),讓其它需要進行運算的線程去占用運算,充分利用CPU讓其不停的運算處理。

就好比工人用計算器計算登記貨車運來的貨物(計算器好比CPU,貨車運貨物好比IO流),一個工人在等待運磚塊的貨車,運磚貨車一到,工人便拿起計算器累加計算已到的總磚塊數量,計算登記好后等待下一輛運轉貨車到來,計算器也就放在一旁了,而每個工人職責分明,不會去登記其它貨物,造成計算器資源浪費。如果同時有多個工人進行登記,一個工人計算登記好運磚貨物便釋放計算器并等待下一輛運轉貨車到來;在第一個工人等待過程中,下一個工人可以使用計算器計算登記運沙貨物,登記好后釋放計算器并等待下一輛運沙貨車到來;一直釋放、占用循環下去,充分利用計算器資源。

使用多線程能夠充分利用CPU,看起來像多個任務同時并行接收與執行,但相對于CPU來說任務還是一個一個依次串行處理,并沒有并行執行,只是CPU資源沒有浪費,得到充分利用,效率便上來了。

單核+IO密集型任務場景時,使用異步IO操作時可以考慮使用多線程處理能提高處理效率,在進行異步IO操作時,線程可以釋放CPU;使用同步IO操作時,線程會被阻塞,不會釋放CPU,即使啟動多個線程執行,多個線程也只是同時接收任務,最終任務還是被串行執行,所以使用多線程相比于單線程處理效率并沒有提高,可能還會效率還低一點。

多核 + 計算密集型任務:

在多核情況下,有多個物理核心處理器,多個線程可以分別獲取不同的核心處理器(CPU)同時處理任務。就好比工人使用計算器來記賬,可以為每個工人都分配一個計算器,多個工人同時使用計算器計算加減乘除來獲得結果。

在處理計算密集型任務的時候,使用多個線程可以同時接收多個計算密集型任務并進行運算處理,多個任務并行運算處理,提高整體的執行效率;而如果只使用單線程來處理,任務只能串行處理,一個線程只能使用一個CPU,其它CPU就處于空閑狀態。就好比多個工人都在做記賬任務,每個工人都配備一個計算器,這個時候每個工人可以并行計算記賬,而無需等待。

多核 + 計算密集型任務場景時,使用多線程處理就可以極大提升任務處理效率。

多核 + IO密集型任務:

在處理IO密集型任務的時候,雖然多線程可以分別落在不同的核心處理器(CPU)去處理任務,不管是同步IO還是異步IO操作,多線程下都可以并行執行多個任務,相比于單線程處理效率得到極大提升。對于同步IO和異步IO操作,異步IO操作下可以使更多線程搶占CPU執行,更充分的利用CPU;同步IO操作會浪費大量的CPU資源。

同樣使用工人用計算器計算登記貨車運來的貨物(計算器好比CPU,貨車運貨物好比IO流)的例子。對于同步IO,就好比工人使用完計算器后不給下一個工人使用,一直占有知道所有貨物運完計算登記完為止。那么一個工人使用一個計算器只登記自己負責的貨物線路,多個工人使用多個計算器可以同時并行登記各自負責的貨物線路,任務處理速度是上來了,但浪費了更多的資源。對于異步IO,就好比工人使用完計算器后就釋放出來不占用,讓下一個工人使用。在指定數量的計算器下,就可以有指定數量的工人同時并行計算登記各自的貨物線路,在使用計算器計算完后,釋放計算器,在等待下一輛貨車運貨到來之前,就可以有多個計算器釋放出來讓其它多個工人繼續使用登記,宏觀上看,在指定數量的計算器下,有更多的工人同時計算登記,這樣不僅任務處理速度是上來了,而且計算器也能夠得到充分使用。

多核 + IO密集型任務場景時,使用多線程處理就可以極大提升任務處理速度。


異步 I/O 和同步 I/O 是兩種不同的 I/O 操作模式,它們在執行過程和效率上有著明顯的差異。

同步 I/O 操作:

  • 同步 I/O 操作會阻塞當前線程,直到 I/O 操作完成。
  • 在 I/O操作執行期間,當前線程無法處理其他任務,系統的并發能力受限。
  • 編程模型相對簡單,代碼結構清晰。
  • 適用于 CPU 密集型任務或 I/O操作時間較短的場景。

異步 I/O 操作:

  • 異步 I/O 操作不會阻塞當前線程,而是繼續執行其他任務。
  • I/O 操作完成時,通過回調函數或事件通知調用者。
  • 可以通過多線程同時執行多個異步 I/O 操作,充分利用 CPU 資源,提高 I/O 吞吐量。
  • 適用于 I/O 密集型任務,如網絡通信、文件I/O 等,可以提高系統的并發能力和響應性。
  • 但是實現異步 I/O 操作需要更復雜的編程模型,增加了代碼的復雜度。

在單核 CPU 情況下,I/O 密集型任務使用同步 I/O 操作時,單線程和多線程的效率對比如下:

單線程同步 I/O 操作:

  • 在單核 CPU 上,當執行同步 I/O 操作時,當前線程會被阻塞,無法執行其他任務。
  • 整個系統只能順序地執行 I/O 操作,效率較低。
  • 當 I/O 操作時間較長時,系統的響應性會大大降低。

多線程同步 I/O 操作:

  • 在單核 CPU 上,即使啟動多個線程執行同步 I/O 操作,也只能被串行執行。
  • 每個線程在執行 I/O 操作時仍然會被阻塞,無法處理其他任務。
  • 線程上下文切換也會帶來一定的性能開銷。
  • 因此,多線程并不能提高 I/O 密集型任務在單核 CPU上的效率。

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

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

相關文章

Java并發編程——線程安全

在Java并發編程中,線程安全是一個非常重要的概念。當多個線程同時訪問共享數據時,如果沒有采取適當的同步措施,就可能會導致數據不一致或其他不可預期的行為,這就是線程不安全的情況。 為了保證線程安全,Java提供了一…

Google Ads谷歌廣告賬戶被封停怎么辦?

跨境出海業務少不了需要做Google Ads推廣業務;其中讓投手們聞風喪膽的消息就是帳戶被暫停。當 Google 檢測到任何違反其政策且可能損害用戶在線體驗的行為時,就會發生這種情況。那么如何在做廣告推廣的同時,保證賬號不被封禁呢?看…

【微服務最全詳解】

文章目錄 微服務微服務的介紹微服務服務架構演變 微服務網關微服務的負載均衡微服務的容災機制服務崩潰服務容災機制微服務熔斷機制微服務限流Sentinel怎么實現限流微服務限流算法1.令牌桶算法2.漏斗桶算法 服務監控日志收集 微服務 微服務的介紹 微服務是一種軟件架構風格&a…

大模型日報2024-05-15

大模型日報 2024-05-15 大模型資訊 OpenAI推出全新AI模型GPT-4o,具備文本、圖像和音頻處理能力 摘要: OpenAI公司繼ChatGPT后,最新推出了名為GPT-4o的AI模型。這一模型不僅能夠理解和生成文本,還新增了圖像和音頻的解釋及生成功能。GPT-4o作為…

中國開源 AI 大模型之光-InternLM2

今天給大家帶來 AI 大模型領域的國產之光 - InternLM2,在10B量級開源大模型領域取得了全球 Top 3 的成績,僅次于 Meta 發布的 Llama-3,在國內則是第一名的存在! 簡介 InternLM2是由上海人工智能實驗室和商湯科技聯合研發的一款大型…

最大子序列的分數

題目鏈接 最大子序列的分數 題目描述 注意點 n nums1.length nums2.length從nums1和nums2中選一個長度為k的子序列對應的下標對nums1中下標對應元素求和&#xff0c;乘以nums2中下標對應元素的最小值得到子序列的分數0 < nums1[i], nums2[j] < 1000001 < k < …

Leecode熱題100---560:和為k的子數組個數

題目&#xff1a; 給你一個整數數組 nums 和一個整數 k &#xff0c;請你統計并返回 該數組中和為 k 的子數組的個數 。 子數組是數組中元素的連續非空序列。 C&#xff1a; #include<iostream> #include<vector> using namespace std; class Solution { public:…

AI作畫算法詳解:原理、應用與未來發展

隨著人工智能技術的不斷發展&#xff0c;AI作畫逐漸成為了一個熱門話題。AI作畫&#xff0c;即利用人工智能算法生成繪畫作品&#xff0c;不僅僅是技術的展示&#xff0c;更是藝術與科技結合的創新體現。本文將深入探討AI作畫的核心算法原理&#xff0c;并通過實例幫助讀者更好…

多步預測系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合

● 環境框架&#xff1a;python 3.9 pytorch 1.8 及其以上版本均可運行 ● 使用對象&#xff1a;論文需求、畢業設計需求者 ● 代碼保證&#xff1a;代碼注釋詳細、即拿即可跑通。 往期精彩內容&#xff1a; 時序預測&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分…

數據結構篇3—《龍門客“棧”》

文章目錄 &#x1f6a9;前言1、棧的概念2、棧的實現框架3、棧的代碼實現3.1、棧的初始化和銷毀3.2、入棧\出棧\返回棧頂元素\元素個數\判空3.3、棧定義注意事項 4、棧的應用實例——《括號匹配問題》 &#x1f6a9;前言 前面記錄了關于順序表和鏈表的數據結構&#xff0c;這一篇…

【CF1965A】Everything Nim

題目鏈接 前置trick&#xff1a; 使用vector去重&#xff1a; vector<int> a(n);for(int i0;i<n;i) cin>>a[i];sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());na.size();題意&#xff1a; 有 n n n堆石子&#xff0c;第 i i i堆有 a i a…

【企業宣傳片】拍攝思維提升,專業影視質感核心揭密,一課搞定

課程下載&#xff1a;【企業宣傳片】拍攝-課程網盤鏈接提取碼下載.txt資源-CSDN文庫 更多資源下載&#xff1a;關注我。 課程介紹 大量案例分析宣傳片拍攝的痛點要點 根據案例告訴你解決方案&#xff0c;講透概念 改變你對企業宣傳片的思維層級與認知 歸納總結對比不同案…

C++語法|類直接包含與自身類型相同的成員變量?

在C中&#xff0c;一個類不能直接包含與自身類型相同的成員變量。這是因為類的大小需要在編譯時確定&#xff0c;而一個包含自身類型的成員變量會導致遞歸定義&#xff0c;從而無法確定類的大小。 文章目錄 示例代碼&#xff08;非法定義&#xff09;解決辦法1.使用指針2.使用智…

k8s 二進制安裝 優化架構之 部署負載均衡,加入master02

目錄 一 實驗環境 二 部署 CoreDNS 1&#xff0c;所有node加載coredns.tar 鏡像 2&#xff0c;在 master01 節點部署 CoreDNS 3&#xff0c; DNS 解析測試 4&#xff0c; 報錯分析 5&#xff0c;重新 DNS 解析測試 三 master02 節點部署 1&#xff0…

AI學習指南數學工具篇-PCA的應用場景

AI學習指南數學工具篇-PCA的應用場景 在人工智能領域&#xff0c;數據處理是非常重要的一環。對于大量高維數據&#xff0c;我們往往需要進行數據降維來減少計算復雜度&#xff0c;同時利用可視化工具對數據進行分析和理解。主成分分析&#xff08;Principal Component Analys…

C++ 利用標準庫多字節轉寬字節字符

在 C/C 之中&#xff0c;通常建議使用&#xff1a;mbstowcs &#xff08;C語言函數庫&#xff09;來實現多字節字符轉寬字節字符&#xff0c;這是因為如果使用。 std::wstring_convert<std::codecvt_utf8<wchar_t>> 模板來實現&#xff0c;它可能導致程序崩潰的風險…

【利用數組處理批量數據-譚浩強配套】(適合專升本、考研)

無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 無償分享學習資料&#xff0c;需要的小伙伴評論區或私信dd。。。 完整資料如下&#xff1a;純干貨、純干貨、純干貨&#xff01;&#xff01;…

點云成圖原理

點成圖&#xff08;Point Cloud&#xff09;是指由一組離散的點構成的圖形&#xff0c;它們在空間中沒有任何連接關系。點成圖通常是由激光雷達、相機或其他傳感器獲取的三維數據&#xff0c;用于表示現實世界中的物體或場景。 三角成圖&#xff08;Triangulation&#xff09;…

element ui Tree樹形控件

lazy 是否懶加載子節點&#xff0c;需與 load 方法結合使用 boolean 默認為falseload 加載子樹數據的方法&#xff0c;僅當 lazy 屬性為true 時生效 function(node, resolve)使用懶加載load不需要再使用data&#xff0c;利用resolve返回值即可注意&#xff1a;第一層的數據要寫…

PMR-440N7Q韓國施耐德三和相序繼電器EOCR-PMR

韓國施耐德三和EOCR繼電器PMR-440N7Q PMR-440-N 直流電動機保護器:DCL、DOCR-S/H 欠電流繼電器:EUCR-3C 交流電壓繼電器:EOVR、EVR-PD、EVR-FD、EUVR 韓國三和EOCR電動機保護器:EOCR-SS、EOCR-SS1/SS2、EOCR-AR、EOCR-ST、EOCR-SP、EOCR-SP1/SP2、EOCR-SE、EOCR-SE2/SE PMR-44…