Java并發(fā)之線程(一)

線程

概念

  • 線程是操作系統(tǒng)里的一個(gè)概念,雖然各種不同的開發(fā)語言如 Java、C# 等都對(duì)其進(jìn)行了封裝,但是萬變不離操作系統(tǒng)。Java 語言里的線程本質(zhì)上就是操作系統(tǒng)的線程,它們是一一對(duì)應(yīng)的。
  • 線程是操作系統(tǒng)進(jìn)程中能夠獨(dú)立執(zhí)行的實(shí)體(控制流),是處理器調(diào)度和分派的基本單位。線程是進(jìn)程的組成部分,每個(gè)進(jìn)程內(nèi)允許包含多個(gè)并發(fā)執(zhí)行的實(shí)體(控制流),這就是多線程。同一個(gè)進(jìn)程中的所有線程共享進(jìn)程獲得的主存空間和資源,但不擁有資源。線程具有:
    • 線程執(zhí)行狀態(tài)(運(yùn)行、就緒、等待、…);
    • 當(dāng)線程不運(yùn)行時(shí),有一個(gè)受保護(hù)的線程上下文,用于存儲(chǔ)現(xiàn)場(chǎng)信息。所以,觀察線程的一種方式是運(yùn)行在進(jìn)程內(nèi)一個(gè)獨(dú)立的程序計(jì)數(shù)器;
    • 一個(gè)執(zhí)行堆棧
    • 一個(gè)容納局部變量的主存存儲(chǔ)區(qū)。
  • 雖然在 Java 語言中創(chuàng)建線程看上去就像創(chuàng)建一個(gè)對(duì)象一樣簡單,只需要 new Thread() 就可以了,但實(shí)際上創(chuàng)建線程遠(yuǎn)不是創(chuàng)建一個(gè)對(duì)象那么簡單。創(chuàng)建對(duì)象,僅僅是在 JVM 的堆里分配一塊內(nèi)存而已;而創(chuàng)建一個(gè)線程,卻需要調(diào)用操作系統(tǒng)內(nèi)核的 API,然后操作系統(tǒng)要為線程分配一系列的資源,這個(gè)成本就很高了,所以線程是一個(gè)重量級(jí)的對(duì)象,應(yīng)該避免頻繁創(chuàng)建和銷毀

Java線程的發(fā)展歷史

Java中的線程本質(zhì)上對(duì)應(yīng)到操作系統(tǒng)的線程的,因此其發(fā)展歷史與操作系統(tǒng)線程的發(fā)展歷史息息相關(guān),這個(gè)可以參考文章Java并發(fā)編程:進(jìn)程和線程之由來

與協(xié)程對(duì)比

  • 協(xié)程是很早之前就有的概念,維基百科上還加上了纖程等概念導(dǎo)致理解起來很復(fù)雜。其實(shí)協(xié)程可以理解為協(xié)作式的線程,協(xié)作體現(xiàn)在程序主動(dòng)交出控制權(quán)。
  • 協(xié)程的優(yōu)勢(shì):
    • 節(jié)省資源,輕量,具體就是:
      • 節(jié)省內(nèi)存,每個(gè)線程需要分配一段棧內(nèi)存,以及內(nèi)核里的一些資源
      • 節(jié)省分配線程的開銷(創(chuàng)建和銷毀線程要各做一次syscall)
      • 節(jié)省大量線程切換帶來的開銷
    • 與NIO配合實(shí)現(xiàn)非阻塞的編程,提高系統(tǒng)的吞吐
    • 使用起來更加舒服順暢(async+await,跑起來是異步的,但寫起來感覺上是同步的)
  • 參考資料:

與進(jìn)程對(duì)比

線程是進(jìn)程的組成部分, 與同一個(gè)進(jìn)程中的其他線程共享進(jìn)程獲得的主存空間和資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容