最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【Java】《2小時(shí)搞定多線程》個(gè)人筆記

2023-08-24 14:45 作者:懶時(shí)小窩  | 我要投稿

Part1簡(jiǎn)介

基于慕課網(wǎng)站上的一個(gè)一元錢課程《2小時(shí)搞定多線程》的 個(gè)人筆記。

Part2線程的起源

我們先來看看網(wǎng)絡(luò)中關(guān)于線程起源的說明,理解線程的來龍去脈對(duì)于掌握多線程有一定幫助。

此部分內(nèi)容整理自下面兩篇網(wǎng)絡(luò)博客:

  • # 線程是什么

  • # 線程的起源

線程的起源與計(jì)算機(jī)的發(fā)展息息相關(guān)。早期的計(jì)算機(jī)系統(tǒng)是單指令模式,資源利用效率低下。當(dāng)批處理模式即計(jì)算機(jī)的多指令模式出現(xiàn)后,計(jì)算機(jī)資源利用率得到有效提升,但這種模式又經(jīng)常導(dǎo)致 CPU 陷入等待狀態(tài),無法得到充分利用,于是進(jìn)程出現(xiàn)了。

當(dāng)用戶對(duì)計(jì)算機(jī)發(fā)出一系列操作指令時(shí),每個(gè)進(jìn)程會(huì)將不同的操作儲(chǔ)存起來,隨時(shí)進(jìn)行切換。但是進(jìn)程的指令執(zhí)行效率仍然不夠快,無法在同一時(shí)刻執(zhí)行多個(gè)任務(wù)。為了解決這一問題,技術(shù)人員又發(fā)明了線程。

有了線程以后,每個(gè)操作指令對(duì)應(yīng)的任務(wù)都能夠被劃分為多個(gè)子任務(wù),由每一個(gè)單獨(dú)的線程負(fù)責(zé),而不同的線程可以同時(shí)運(yùn)行,這樣計(jì)算機(jī)的運(yùn)行效率便得到進(jìn)一步提升。

我們可以把上面的幾段內(nèi)容做一個(gè)概括:

  1. 單指令模式(類似計(jì)算器)。

  2. 多指令模式(批處理)。

  3. 批處理存在CPU等待情況,進(jìn)程誕生。

  4. 進(jìn)程指令運(yùn)行效率不滿足需求,為了處理多任務(wù)線程誕生。

我們會(huì)發(fā)現(xiàn)這里存在一些不太清楚的概念,單指令是什么?多指令模式又是什么?為什么批處理存在CPU等待情況等等.....下面我們至上而下進(jìn)行簡(jiǎn)單分析。

1單指令模式(類似計(jì)算器)

在計(jì)算機(jī)誕生的最早期,計(jì)算機(jī)屬于政府和一些大型公司才有的”昂貴“儀器,受制各種因素限制,當(dāng)時(shí)計(jì)算機(jī)只能完成一些類似”1+1“的指令操作,并且要完成這樣的操作需要用戶把程序?qū)懭氲酱蚩卓ǎ梢钥醋髯钤缙诘拇鎯?chǔ)設(shè)備)并由專門操作人員完成執(zhí)行,整個(gè)過程非常繁瑣。

受這樣的工作模式限制,不管來多少個(gè)用戶進(jìn)行輸入,也只能等待計(jì)算機(jī)管理人員拿到”指令“(物理意義上)完成執(zhí)行。在”拿指令“和”執(zhí)行“的間隙,整個(gè)計(jì)算機(jī)都是空閑不干活的,資源利用率極低。

2多指令模式(批處理)

隨著CPU的執(zhí)行效率提升以及對(duì)CPU資源利用率的要求提升,計(jì)算機(jī)管理員逐漸成為執(zhí)行瓶頸,由此誕生了多指令模式。 多指令模式類似飯店點(diǎn)餐一次性下多個(gè)指令批量完成。為此人們?cè)O(shè)計(jì)了對(duì)應(yīng)的批處理操作系統(tǒng),由它代替計(jì)算機(jī)管理員完成任務(wù)的執(zhí)行切換工作,

批處理可以挨個(gè)執(zhí)行多個(gè)指令,此時(shí)我們可以把整個(gè)計(jì)算機(jī)本身類比為”單進(jìn)程“操作,所以批處理在某些情況下依然存在”閑置“的情況,比如4條指令中第3條需要訪問IO設(shè)備,此時(shí)第4條指令哪怕和第3條沒有任何關(guān)系也依然需要等待。

3進(jìn)程誕生

以上的工作模式被叫做”單道批處理操作系統(tǒng)“,后面為了解決等待問題,人們又設(shè)計(jì)了多道批處理操作系統(tǒng)(也叫多任務(wù)操作系統(tǒng)),它的改進(jìn)優(yōu)勢(shì)如下:

  • 內(nèi)存劃分多個(gè)區(qū)域,每個(gè)區(qū)域存儲(chǔ)一個(gè)程序。

  • 程序執(zhí)行 I/O 操作時(shí),操作系統(tǒng)會(huì)將 CPU 資源分配給其它等待執(zhí)行的程序。

由此”進(jìn)程“的基礎(chǔ)概念便誕生了,進(jìn)程就是執(zhí)行中的應(yīng)用程序,操作系統(tǒng)會(huì)為每個(gè)進(jìn)程分配獨(dú)立的內(nèi)存、空間和所需要的資源(IO設(shè)備,文件等)。

4線程誕生

但是隨著計(jì)算機(jī)軟硬件的發(fā)展,人們發(fā)現(xiàn)像進(jìn)程這種”指揮軍隊(duì)“的粒度代價(jià)很高并且難以控制,后面又提出了線程的概念。

進(jìn)程調(diào)度的一些問題:

  • 進(jìn)程切換開銷大。

  • 進(jìn)程占用空間是獨(dú)立的,實(shí)現(xiàn)進(jìn)程通信難度很大。

  • 單個(gè)進(jìn)程本身執(zhí)行類似IO操作依然會(huì)出現(xiàn)等待情況。(只不過此時(shí)可以切換到其他進(jìn)程)

至此我們簡(jiǎn)單梳理了單指令模式到線程誕生的全過程。

Part3線程和進(jìn)程的關(guān)系

線程包含于進(jìn)程當(dāng)中,進(jìn)程是線程的集合。

當(dāng)操作系統(tǒng)運(yùn)行時(shí),至少有一個(gè)進(jìn)程會(huì)啟動(dòng),而這個(gè)進(jìn)程中往往包含了多個(gè)線程。

Part4線程和進(jìn)程的區(qū)別

相同點(diǎn)如下:

兩者都生命周期是由一樣的,線程會(huì)隨著進(jìn)程結(jié)束而一起結(jié)束。

不同點(diǎn)如下:

  • 起源不同:先有進(jìn)程后有線程,早期CPU為了跟上外部操作,后續(xù)出現(xiàn)線程的概念來提高效率。

  • 概念不同:線程是CPU調(diào)度的最小單位,而進(jìn)程是操作系統(tǒng)調(diào)度程序的獨(dú)立單位。

  • 作用域不同:通常線程存在共享區(qū)域,但是在進(jìn)程和進(jìn)程之間內(nèi)容不共享(除非使用類似IPC手段進(jìn)行進(jìn)程通信)。

  • 開銷不同:進(jìn)程之間通信需要內(nèi)核輔助創(chuàng)建開銷相對(duì)較大,而線程通信創(chuàng)建線程的開銷很小。

    • 線程創(chuàng)建終止時(shí)間比進(jìn)程短。

    • 同一個(gè)進(jìn)程內(nèi)線程切換時(shí)間比進(jìn)程短。

    • 同一個(gè)進(jìn)程內(nèi)線程可以互相共享文件資源和內(nèi)存,并且不依賴內(nèi)核就可以完成。

  • 擁有資源不同,線程在擁有進(jìn)程大部分基本資源之外還有獨(dú)立的內(nèi)容。

  • 數(shù)量不同:同一個(gè)進(jìn)程通常只有一個(gè),而每個(gè)進(jìn)程至少有一個(gè)線程。

這里強(qiáng)調(diào)一下?lián)碛匈Y源不同的含義,線程共享內(nèi)容包括:

  1. 進(jìn)程代碼段。

  2. 進(jìn)程公有資源(線程可以利用進(jìn)程的共享資源簡(jiǎn)單通信)。

  3. 進(jìn)程打開的文件描述符。

  4. 信號(hào)處理器。

  5. 進(jìn)程當(dāng)前目錄。

  6. 進(jìn)程ID進(jìn)程組ID

線程獨(dú)有內(nèi)容包括:

  1. 寄存器的值

  2. 線程ID

  3. 線程名稱

  4. 線程堆棧

  5. 錯(cuò)誤返回號(hào)碼

  6. 線程信號(hào)屏蔽碼

Part5Java 和 多線程

為了迎合時(shí)代需求,Java自誕生之初就天然支持多線程,Java的多線程實(shí)現(xiàn)是和內(nèi)核線程一對(duì)一映射。

5Jvm 天然多線程驗(yàn)證

Jvm啟動(dòng)需要自動(dòng)開啟一些后臺(tái)線程維持工作:

  • Finalize線程:處理部分對(duì)象的finalize操作。高版本jdk已經(jīng)棄用此實(shí)現(xiàn)

  • Single signature:接收操作系統(tǒng)的信號(hào)量來進(jìn)行一些操作,比如Kill的信號(hào)量接收強(qiáng)制關(guān)閉程序。

  • main 線程:也叫主線程,其他用戶創(chuàng)建的線程都都叫做子線程

  • reference gc:垃圾回收線程,對(duì)象清理工作

為了證明上面的理論,我們可以通過IDEA進(jìn)行調(diào)試來驗(yàn)證答案。

首先我們通過IDEA編寫一個(gè)HelloWorld程序,當(dāng)然為了方便這里個(gè)人直接拿了SpringBoot的Main啟動(dòng)代碼進(jìn)行驗(yàn)證。

public?class?InterviewApplication?{??
??
????public?static?void?main(String[]?args)?{??
????????SpringApplication.run(InterviewApplication.class,?args);??
????}??
??
}

我們把Debug斷點(diǎn)打在代碼的第一行,然后Idea中直接Debug運(yùn)行。

image.png

通過下面的篩選功能,我們可以Debug中切換到其他的線程進(jìn)行觀察多線程執(zhí)行情況。

image.png

下面j結(jié)果使用為JDK11運(yùn)行。

image.png

除了上面這種觀察方式之外,我們可以通過“Threads“視圖界面觀察所有線程的運(yùn)行情況。以IDEA2022版本為例,打開”Threads“視圖只需要在右上角點(diǎn)擊小方塊然后勾選“Threads”即可。

下面結(jié)果使用JDK8運(yùn)行。

image.png

個(gè)人更喜歡上面的展現(xiàn)方式,平鋪直敘告訴開發(fā)者當(dāng)前斷點(diǎn)內(nèi)的線程運(yùn)行情況。

如果想要多線程Debug,可以鼠標(biāo)右擊斷點(diǎn),接著會(huì)出現(xiàn)相關(guān)提示切換到“Thread”,,在調(diào)試多線程代碼的時(shí)候,這個(gè)操作會(huì)非常方便好用。

image.png

通過上面的簡(jiǎn)單講解可以證明Java天生就是多線程程序(哪怕只有一行代碼)。

Part6理解多線程

6多線程概念

一個(gè)進(jìn)程中擁有多(≥2)個(gè)線程,線程之間相互協(xié)作、共同執(zhí)行一個(gè)應(yīng)用程序。

現(xiàn)代概念中把僅有單個(gè)線程工作的應(yīng)用程序成為單線程程序。

7多線程目的

  • 提高CPU處理效率。

  • 避免無效等待(IO過程可以別的事情)。

  • 提高用戶體驗(yàn),避免卡頓和縮短等待時(shí)間。

    • 并行處理:提高性能,多個(gè)線程接收http請(qǐng)求。

    • 安卓開發(fā):主線程只能繪制界面。線程不允許io或者網(wǎng)絡(luò)請(qǐng)求,避免卡頓影響體驗(yàn)。

  • 編程建模。

  • 摩爾定律失效之后,CPU的頻率逐漸達(dá)到瓶頸,根本處理器越來越接近納米工藝,再往下原子設(shè)計(jì)無法突破物理極限。導(dǎo)致單核的性能主頻提升已經(jīng)越過臨界點(diǎn)。

    • CPU由單核轉(zhuǎn)為多核多線程,多線程利用越發(fā)重要。

  • 阿姆達(dá)爾定律:處理器越多,處理效率越高,但是上限取決于串行部分的代碼占比,占比越小性能越高。

8阿姆達(dá)爾定律

在處理器運(yùn)行單核速度放緩的今天,處理器開始追求多核心多線程,但是需要注意多線程的效率提升取決于代碼能夠用到多少并行性能

如果一個(gè)程序只能單核單線程串行運(yùn)行,那么程序運(yùn)行的時(shí)候多線程是沒有任何意義的,如果代碼支持一半并行一半串行,效率提升2倍,如果程序有95%支持并行,那就可以提升20倍性能。

通過下面這個(gè)圖,可以很直觀的看到并行帶來質(zhì)的提升。

image.png

9多線程局限

多線程的引入不可避免的帶來更為復(fù)雜的情況。

  • 異構(gòu)化任務(wù)很難高效并行。

  • 性能安全問題。

    • 上下文切換。

    • 共享數(shù)據(jù)互相篡改幻讀。

    • 緩存失效

  • 線程安全問題。

    • 編碼設(shè)計(jì)邏輯漏洞等。

    • 活躍性問題(線程饑餓、死鎖)。

    • 非原子操作問題(例如 i++)。

10多線程的生活案例

這里列舉生活中吃火鍋的案例來理解多線程:

  1. 大火鍋一個(gè)人吃:?jiǎn)芜M(jìn)程單線程串行執(zhí)行。

  2. 大火鍋多人吃:?jiǎn)芜M(jìn)程多線程。

  3. 每人小火鍋:多進(jìn)程多線程。

  4. 吃火鍋底料:資源不足 。

Part7并發(fā)和并行

11并發(fā)和并行的前提

  • CPU的飛速發(fā)展,比如 i7 出現(xiàn)多核多線程。

  • 編程語言自身支持多線程,這一點(diǎn)很重要,比如Java天生具備多線程能力。

    • 一對(duì)一映射內(nèi)核線程。

    • 充分利用操作系統(tǒng)資源。

  • 操作系統(tǒng)本身:操作系統(tǒng)對(duì)于多線程的利用也很關(guān)鍵,操作系統(tǒng)通過編程語言的邏輯進(jìn)行多線程。調(diào)度是性能影響的關(guān)鍵。

12理清兩者概念

并發(fā)

利用超線程技術(shù)模擬多核并發(fā)

實(shí)際上包含了兩種概念,第一種:并發(fā)存在程序“并發(fā)性”,第二種:多個(gè)任務(wù)的執(zhí)行狀態(tài)是“并發(fā)”的。

這兩種概念都有一個(gè)很好的比喻,也就是我們的大腦,我們大腦可以具備“并發(fā)性”,比如可以同時(shí)操作鼠標(biāo)和鍵盤。另一個(gè)意義操作鼠標(biāo)和鍵盤這兩個(gè)動(dòng)作是并發(fā)但不是并行的,同時(shí)畫圓和畫圈(需要經(jīng)過一定的訓(xùn)練)可以看作是并行的。

并發(fā)存在程序“并發(fā)性”

  • 此時(shí)并發(fā)和并行的概念不在同一個(gè)維度。

  • 同一個(gè)時(shí)間可能有多個(gè)線程接替工作,給使用者的感受好像是在同時(shí)工作,比如邊敲鍵盤,邊操作鼠標(biāo),實(shí)際上是受到程序并發(fā)性的影響。

  • 不同的部分在無序或者同時(shí)執(zhí)行,但是最終結(jié)果不影響。

  • 無論單核還是多核心,只要能得出正確結(jié)果,就具備并發(fā)性

  • 這時(shí)候和多個(gè)任務(wù)執(zhí)行狀態(tài)的概念是不在一個(gè)維度上的, 而是更高維度。

多個(gè)任務(wù)的執(zhí)行狀態(tài)是“并發(fā)”的

  • 這種情況下是邏輯上的“并行”,并不是真正的并行。

  • 重疊的時(shí)間段交替運(yùn)行

  • 并發(fā)不一定并行

  • 并行一定并發(fā)

  • 并發(fā),并發(fā)和并發(fā)的不同

并行

image.png

并行的例子就是兩個(gè)動(dòng)作物理上同時(shí)發(fā)生,比如邊打游戲,邊接電話這兩個(gè)動(dòng)作可以同時(shí)進(jìn)行。

  • 并行是多個(gè)核心可以在同一個(gè)時(shí)間線物理上同時(shí)工作

  • 并行一定并發(fā)

  • 依托于現(xiàn)代處理的發(fā)展

  • 多核能力強(qiáng)化

  • 編程語言支持多線程

兩者關(guān)系

image.png

上面的圖可以得出幾個(gè)概念

  • 并發(fā)不一定并行

  • 并行一定并發(fā)

  • 并行和并發(fā)是并行包含在并發(fā)的概念里面,所以并行的前提是并發(fā)

13提問:并發(fā)程序一定是并行的么?

結(jié)論:并發(fā)程序不一定并行,但是并行程序一定是并發(fā)的。

不一定,因?yàn)閱魏颂幚砥魍ㄟ^快速的上下文切換也可以達(dá)到類似并行的效果,實(shí)際上是利用搶占式的系統(tǒng)調(diào)用和分片式的系統(tǒng)調(diào)用完成的。

單核邏輯上同行運(yùn)行叫做并發(fā)。上下文切換非???,所以會(huì)認(rèn)為是并行的。多核實(shí)現(xiàn)了物理上并行,核心和核心之間互相獨(dú)立,可以真正意義上物理時(shí)間可以實(shí)現(xiàn)。

比喻:是一個(gè)人操作多條流水線,好像每一個(gè)流水線都可以處理任務(wù)。多個(gè)人在流水線上,一個(gè)流水線掛了可以由別的流水線接收。

并發(fā)繼續(xù)拓展

  • 表面上多個(gè)任務(wù)執(zhí)行狀態(tài)。

  • 程序上的并發(fā)性也叫做并發(fā)。

Part8高并發(fā)和多線程關(guān)系

多線程是解決高并發(fā)問題的解決方案之一,但是多線程不是高并發(fā)的唯一辦法。

比如redis操作數(shù)據(jù)就是單線程實(shí)現(xiàn)的(保證原子性非常簡(jiǎn)單),因?yàn)闆]有上下文切換十分高效,它沒有用到多線程卻頁解決了數(shù)據(jù)庫高并發(fā)的問題,分擔(dān)壓力。

拓展:

  • 并行的程序執(zhí)行效率取決于開發(fā)者的代碼。

  • 取決于處理器的性能。

  • 操作系統(tǒng)的調(diào)度。

Part9高并發(fā)的性能指標(biāo)

  • QPS:每秒的查詢數(shù)量,越高說明服務(wù)器可以承受的瞬間壓力越大

  • 帶寬:決定了例如視頻網(wǎng)站的服務(wù)質(zhì)量。

  • PV(Page View):也就是訪問和點(diǎn)擊量。

  • UV(Unique View):表示單個(gè)用戶訪問的次數(shù),是對(duì)于PV的訪問量和點(diǎn)擊率

    • UV一定會(huì)小于PV

  • IP和UV:最大的區(qū)別是是否是同一個(gè)用戶的操作決定,也就是Cookie

    • IP可能沒有變但是Cookie在切換

    • IP沒有變,UV+1

    • IP是每個(gè)人單獨(dú)IP,但是訪問者的Cookie是一樣的

    • IP+1,Uv不變

    • 兩個(gè)不同的指標(biāo)

    • 第一個(gè)指標(biāo) IP:撥號(hào)上網(wǎng)IP變動(dòng)

    • 第二個(gè)指標(biāo) UV:局域網(wǎng)同一個(gè)賬戶多個(gè)人使用

  • 并發(fā)連接數(shù)

    • 某個(gè)時(shí)刻同時(shí)接受請(qǐng)求數(shù)量

  • 服務(wù)器平均等待時(shí)間

    • 處理一個(gè)請(qǐng)求所需時(shí)間。

Part10同步和異步/阻塞和非阻塞

14同步和異步

區(qū)分關(guān)鍵點(diǎn):被調(diào)用方的行為

同步

強(qiáng)調(diào)的是被調(diào)用者(服務(wù)器)行為,不是請(qǐng)求方的行為。沒有得到結(jié)果之前,服務(wù)端不返回任何結(jié)果。

和阻塞的判斷剛好相反。

再次強(qiáng)調(diào)是被調(diào)用者(服務(wù)器)行為,不是請(qǐng)求方的行為。

image.png
image.png

異步

調(diào)用之后服務(wù)端立刻返回結(jié)果(通常是一個(gè)通知)。

image.png
image.png

案例:燒水壺、買書

燒水壺:傳統(tǒng)的鐵壺需要等待水燒開才會(huì)有結(jié)果,電水壺只需要理解返回啟動(dòng)結(jié)果即可,因?yàn)楹罄m(xù)水燒開之后會(huì)斷電并且提醒。

買書:同步就是書店買書直到老板給出想要的書之前會(huì)一直被迫等待(被調(diào)用方的行為),網(wǎng)上買書下單之后直接通知結(jié)果過幾天之后到貨。

15阻塞和非阻塞

關(guān)鍵:對(duì)于調(diào)用者而言的服務(wù)端狀態(tài)

  • 站在線程狀態(tài)角度

  • 站在線程發(fā)出請(qǐng)求之后請(qǐng)求方的角度

案例:燒水壺、買書

燒水壺:阻塞就是看著水一直到燒開,非阻塞就是燒水的時(shí)候間隔一段時(shí)間看一眼。

買書:阻塞就是拿到要買的書籍之前老老實(shí)實(shí)等待(調(diào)用方等待),非阻塞書店老板找書的過程中可以逛逛書店看看其他的書籍。

16綜合案例

綜合案例用洗衣服的案例來理解。

同步阻塞

洗衣服丟到洗衣機(jī),全程看著洗衣機(jī)洗完,洗好之后晾衣服。

同步非阻塞

把衣服丟到洗衣機(jī)洗,然后回客廳做其他事情,定時(shí)看看洗衣機(jī)是不是洗完了,洗好后再去晾衣服。(等待期間你可以做其他事情,比如用電腦刷劇看視頻)。

異步阻塞

把衣服丟到洗衣機(jī)洗,然后看著洗衣機(jī)洗完,洗好后再去晾衣服(沒這個(gè)情況,幾乎沒這個(gè)說法,可以忽略)。

異步非阻塞

把衣服丟到洗衣機(jī)洗,然后回客廳做其他事情,洗衣機(jī)洗好后會(huì)自動(dòng)去晾衣服,晾完成后放個(gè)音樂告訴你洗好衣服并晾好了。

Part11常見問題匯總

17線程和進(jìn)程的相同與不同點(diǎn)

不同點(diǎn):

  • 起源不同

  • 概念不同

  • 性能開銷不同

  • 作用域不同

  • 擁有資源不同

  • 數(shù)量不同

相同點(diǎn):生命周期

18并發(fā)和并發(fā)

  • 并發(fā)和高并發(fā)是一個(gè)包含關(guān)系(并行包含并發(fā)),一個(gè)程序并行意味著一定是并發(fā),但是并發(fā)可以模擬出并行的效果。

  • 并發(fā)有兩種概念,如果是程序“并發(fā)性”,則并行和并發(fā)不在一個(gè)維度,可以任務(wù)無論單核或者多核只要結(jié)果正確就具備并發(fā)性。另外一個(gè)程序具備并發(fā)性也算是并發(fā)的說法。

19多線程的弊端

  • 異構(gòu)化任務(wù)無法用多線程完成的任務(wù)不如單線程高效。

  • 線程安全問題,比如共享變量互相覆蓋。

  • 性能問題,比如上下文切換、緩存失效。

20高并發(fā)是否意味著多線程

  • 多線程僅僅是高并發(fā)的解決方案之一,兩者是兩個(gè)不同的概念,不能混為一談。

  • 多線程不是唯一辦法,但確實(shí)是主要辦法。

緩存、消息隊(duì)列、鎖是高并發(fā)的三架馬車

21同步、異步、阻塞、非阻塞

從并發(fā)編程的角度對(duì)著四個(gè)概念進(jìn)行再次整理。

同步異步:和隊(duì)列有關(guān),事情能不能委托給其他人來辦。 阻塞非阻塞:和鎖的機(jī)制有關(guān),做一個(gè)工作的時(shí)候能不能抽空干別的事情。

洗衣機(jī)洗衣服:

  • 同步阻塞:開啟洗衣機(jī),并且全程盯著洗衣機(jī)工作。

  • 同步非阻塞,開啟洗衣機(jī),雖然還是要隔幾分鐘看洗衣機(jī)是否完成工作,但是期間可以干別的事情。

  • 異步阻塞:委托給洗衣機(jī)自己洗衣服,但是要全程盯著取出衣服最后把衣服晾了。

  • 異步非阻塞:告訴洗衣機(jī)自己洗衣服,工作完成之后洗衣機(jī)自動(dòng)把衣服晾了,最后告知結(jié)果。

22單核CPU上多線程的意義

  • 開啟多個(gè)線程可以讓耗時(shí)的任務(wù)交給后臺(tái)處理,利用其他線程提供服務(wù)。

  • 程序不知道運(yùn)行在單核還是多核,單核CPU也可以充分利用多線程提高資源利用率。


【Java】《2小時(shí)搞定多線程》個(gè)人筆記的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
获嘉县| 孟村| 汾西县| 慈利县| 清水县| 博野县| 绥滨县| 乳源| 淮南市| 永昌县| 正安县| 广灵县| 秭归县| 台南市| 凤台县| 垣曲县| 厦门市| 新营市| 许昌市| 汤原县| 洛南县| 洛阳市| 连云港市| 拉孜县| 洪湖市| 唐海县| 湄潭县| 临江市| 龙陵县| 松原市| 铜陵市| 汤阴县| 社旗县| 营口市| 县级市| 康乐县| 定陶县| 类乌齐县| 磴口县| 临沭县| 庄浪县|