最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中的線程模型與線程調(diào)度

 更新時間:2021年02月06日 09:37:03   作者:精靈王  
這篇文章主要介紹了詳解Java中的線程模型與線程調(diào)度的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

JAVA線程模型

線程的實現(xiàn)主要有3種方式:

  • 使用內(nèi)核線程實現(xiàn)(1:1)
  • 使用用戶線程實現(xiàn)(1:N)
  • 使用用戶線程加輕量級進程實現(xiàn)(N:M)

使用內(nèi)核線程實現(xiàn)(Kernel-Level Thread, KLT)(1:1)

內(nèi)核線程就是直接由操作系統(tǒng)內(nèi)核支持的線程,這種線程由內(nèi)核來完成線程的切換,內(nèi)核通過操作調(diào)度器對線程進行調(diào)度,并負責(zé)將線程的任務(wù)映射到各個處理器上。

程序一般不會直接去使用內(nèi)核,而是去使用線程的一種高級接口——輕量級進程(Light Weight Process,LWP),輕量級進程就是我們通常意義上的線程,由于每個輕量級進程都是由一個內(nèi)核線程支持的,因此只有先支持內(nèi)核線程,才能有輕量級進程。這種輕量級進程與內(nèi)核線程直接1:1的關(guān)系稱為一對一線程模型。

優(yōu)點:

實現(xiàn)簡單

缺點:

  • 線程的各種操作都需要系統(tǒng)調(diào)度,需要在用戶態(tài)和內(nèi)核態(tài)中來回切換,系統(tǒng)調(diào)用的代價相對較高;
  • 其次,每個輕量級繼承都需要一個內(nèi)核線程來支持,因此輕量級進程要消耗一定的內(nèi)核資源,一個系統(tǒng)支持的輕量級進程數(shù)量有限,如果系統(tǒng)出現(xiàn)大量線程,會對系統(tǒng)性能有影響;

使用用戶線程實現(xiàn) (1:N)

廣義上來說,一個線程只要不是內(nèi)核線程,就可以認為是用戶線程(User Thread,UT),從這個角度來看,輕量級進程也就是用戶線程,但是輕量級進程始終是和內(nèi)核線程有關(guān)系的,效率終究會受到限制。

狹義上來說,用戶線程指的是完全建立在用戶空間的線程庫上,系統(tǒng)內(nèi)核不能感知到線程存在的實現(xiàn)。用戶線程的建立、同步、調(diào)度和銷毀完全在用戶態(tài)完成,不需要內(nèi)核的幫助。這種線程不需要切換到內(nèi)核態(tài),所以可以是非??焖偾业拖牡?,也可以支持更大規(guī)模的線程數(shù)量。這種進程與用戶線程之間1:N的關(guān)系稱為一對多線程模型。

優(yōu)點:

不需要系統(tǒng)內(nèi)核線程的支持,用戶線程的很多操作對內(nèi)核來說都是透明的,不需要用戶態(tài)和內(nèi)核態(tài)的頻繁切換,使線程的創(chuàng)建、調(diào)度、同步等非???;

缺點:

  • 需要用戶程序自己處理線程的所有操作,JAVA曾經(jīng)使用過用戶線程,最終放棄使用。
  • 由于多個用戶線程對應(yīng)到同一個內(nèi)核線程,如果其中一個用戶線程阻塞,那么該其他用戶線程也無法執(zhí)行;
  • 內(nèi)核并不知道用戶態(tài)有哪些線程,無法像內(nèi)核線程一樣實現(xiàn)較完整的調(diào)度、優(yōu)先級等;

使用用戶線程加輕量級進程實現(xiàn) N:M)

將內(nèi)核線程與用戶線程一起使用的組合方式,為N:M的關(guān)系,這種就是多對多線程模型。

優(yōu)點:

  • 兼具多對一模型的輕量;
  • 由于對應(yīng)了多個內(nèi)核線程,則一個用戶線程阻塞時,其他用戶線程仍然可以執(zhí)行;
  • 由于對應(yīng)了多個內(nèi)核線程,則可以實現(xiàn)較完整的調(diào)度、優(yōu)先級等;

缺點:

實現(xiàn)復(fù)雜
Go語言中的goroutine調(diào)度器就是采用的這種實現(xiàn)方案

JAVA線程的實現(xiàn)

在JDK1.2之前,JAVA線程是基于稱為“綠色線程(Green Thread)”的用戶線程來實現(xiàn)的,而在JDK1.2中,線程模型替換為基于操作系統(tǒng)原生線程模型來實現(xiàn)的。

在目前的JDK版本中,操作系統(tǒng)支持怎樣的線程模型,很大程度上決定了JAVA虛擬機的線程是怎樣映射的,在不同的平臺上實現(xiàn)可能是不一樣的,線程模型只對線程的并發(fā)規(guī)模和操作成本產(chǎn)生影響,對JAVA程序的編碼和運行過程來說,差異都是透明的。

對于Sun JDK 來說,它的Windows版本和 Linux 版本都是使用的一對一線程模型來實現(xiàn)的,即一條線程就映射到一條輕量級進程中,因為 Windows 系統(tǒng)和 Linux 系統(tǒng)提供的線程模型都是一對一的。

JAVA線程調(diào)度

線程調(diào)度是說系統(tǒng)為線程分配處理器使用權(quán)的過程。主要的調(diào)度方式有兩種:

1.協(xié)同式線程調(diào)度

線程的執(zhí)行時間是由線程本身控制的,線程工作執(zhí)行完成之后,需要主動通知系統(tǒng)切換到另一個線程上。Lua 語言中的“協(xié)同例程”就是這類實現(xiàn)。

好處:實現(xiàn)簡單

缺點:線程執(zhí)行時間不可控,可能會一直阻塞,導(dǎo)致系統(tǒng)崩潰

2.搶占式線程調(diào)度

每個線程由系統(tǒng)來分配執(zhí)行時間,線程的切換不由線程本身來決定(在JAVA中,Thread.yield() 可以主動讓出CPU使用權(quán),但要獲取,線程本身是沒有任何辦法的)

優(yōu)點:線程的執(zhí)行時間系統(tǒng)可控,不會有一個線程阻塞而導(dǎo)致整個進程阻塞

JAVA 使用的是搶占式調(diào)度方式

JAVA線程狀態(tài)

JAVA 定義了5種線程狀態(tài),在任意一個時間點上,線程有且只能有一個狀態(tài);5個狀態(tài)分別如下:

1.新建(New)
創(chuàng)建后尚未啟動的線程所處的狀態(tài)
2.運行(Runable)
Runable 包括了操作系統(tǒng)線程狀態(tài)的Running 和 Ready,也就是處于此狀態(tài)的 JAVA 線程可能正在運行,也有可能正在等待分配CPU時間片
3.無限期等待(Waiting)
處于這種狀態(tài)的線程不會被分配CPU 時間片,需要等待被其他線程顯式地喚醒。
以下方法會讓線程進入到無限期等待:

  • 調(diào)用沒有設(shè)置 timeout 參數(shù)的 Object.wait() 方法
  • 調(diào)用沒有設(shè)置 timeout 參數(shù)的 Thread.join() 方法
  • 調(diào)用LockSuport.park() 方法

4.有限期等待(Timed Waiting)
處于這種狀態(tài)的線程也不會被分配CPU 時間片,但是不需要其他線程顯式地喚醒,而是等待一定時間后會由系統(tǒng)自動喚醒
以下方法會讓線程進入到有限期等待:

  • Thread.sleep() 方法
  • 調(diào)用設(shè)置了 timeout 參數(shù)的 Object.wait() 方法
  • 調(diào)用設(shè)置了 timeout 參數(shù)的 Thread.join() 方法
  • 調(diào)用LockSuport.parkNanos(long nanos) 方法
  • 調(diào)用LockSuport.parkUntil(long deadline) 方法

5.阻塞(Blocked)
線程被阻塞了,“阻塞狀態(tài)”與“等待狀態(tài)”的區(qū)別是: 阻塞狀態(tài)在等待獲取一個排它鎖;等待狀態(tài)則是在等待一段時間,或者喚醒動作的發(fā)生。在使用了 synchronized 等同步語句時會進入這種狀態(tài)。
6.結(jié)束(Terminated)
終止線程的線程狀態(tài),線程已完成執(zhí)行。

以上就是詳解Java中的線程模型與線程調(diào)度的詳細內(nèi)容,更多關(guān)于Java 線程模型與線程調(diào)度的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

封开县| 梨树县| 江孜县| 萨嘎县| 广东省| 沿河| 郴州市| 许昌县| 平定县| 温州市| 大洼县| 库车县| 平顶山市| 福海县| 阳山县| 高台县| 萍乡市| 钟祥市| 乐陵市| 边坝县| 普安县| 和政县| 京山县| 昭苏县| 汶上县| 韶关市| 阳原县| 宁南县| 太仆寺旗| 永丰县| 怀柔区| 绥滨县| 洛南县| 墨脱县| 日照市| 都昌县| 全南县| 吴旗县| 扎鲁特旗| 四子王旗| 梅州市|