欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

JAVA線程模型

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

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

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

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

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

優(yōu)點(diǎn):

實(shí)現(xiàn)簡(jiǎn)單

缺點(diǎn):

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

使用用戶(hù)線程實(shí)現(xiàn) (1:N)

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

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

優(yōu)點(diǎn):

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

缺點(diǎn):

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

使用用戶(hù)線程加輕量級(jí)進(jìn)程實(shí)現(xiàn) N:M)

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

優(yōu)點(diǎn):

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

缺點(diǎn):

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

JAVA線程的實(shí)現(xiàn)

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

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

對(duì)于Sun JDK 來(lái)說(shuō),它的Windows版本和 Linux 版本都是使用的一對(duì)一線程模型來(lái)實(shí)現(xiàn)的,即一條線程就映射到一條輕量級(jí)進(jìn)程中,因?yàn)?Windows 系統(tǒng)和 Linux 系統(tǒng)提供的線程模型都是一對(duì)一的。

JAVA線程調(diào)度

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

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

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

好處:實(shí)現(xiàn)簡(jiǎn)單

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

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

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

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

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

JAVA線程狀態(tài)

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

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

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

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

  • 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)在等待獲取一個(gè)排它鎖;等待狀態(tài)則是在等待一段時(shí)間,或者喚醒動(dòng)作的發(fā)生。在使用了 synchronized 等同步語(yǔ)句時(shí)會(huì)進(jìn)入這種狀態(tài)。
6.結(jié)束(Terminated)
終止線程的線程狀態(tài),線程已完成執(zhí)行。

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

相關(guān)文章

  • 關(guān)于HttpClient 引發(fā)的線程太多導(dǎo)致FullGc的問(wèn)題

    關(guān)于HttpClient 引發(fā)的線程太多導(dǎo)致FullGc的問(wèn)題

    這篇文章主要介紹了關(guān)于HttpClient 引發(fā)的線程太多導(dǎo)致FullGc的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java 散列存儲(chǔ)詳解及簡(jiǎn)單示例

    Java 散列存儲(chǔ)詳解及簡(jiǎn)單示例

    這篇文章主要介紹了Java 散列存儲(chǔ)詳解及簡(jiǎn)單示例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java?LockSupport實(shí)現(xiàn)原理示例解析

    java?LockSupport實(shí)現(xiàn)原理示例解析

    這篇文章主要為大家介紹了java?LockSupport實(shí)現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析

    為了簡(jiǎn)化MyBatis的使用,MyBatis提供了接口方式自動(dòng)化生成調(diào)用過(guò)程,可以大大簡(jiǎn)化MyBatis的開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于Mybatis如何通過(guò)接口實(shí)現(xiàn)sql執(zhí)行原理解析的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • mybatis返回的map結(jié)果如何設(shè)置有序

    mybatis返回的map結(jié)果如何設(shè)置有序

    這篇文章主要介紹了mybatis返回的map結(jié)果如何設(shè)置有序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程

    Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程

    循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問(wèn)題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下
    2022-02-02
  • Java集合中的Collection接口總結(jié)

    Java集合中的Collection接口總結(jié)

    這篇文章主要介紹了Java集合中的Collection接口總結(jié),Collection 接口是 List和Set接口的父接口,該接口里定義的方法既可用于操作 Set 集合,也可用于操作 List 集合,需要的朋友可以參考下
    2023-11-11
  • idea中cherry pick的用法

    idea中cherry pick的用法

    Cherry-Pick可以將一個(gè)分支的某些commit,合并到另一個(gè)分支,本文給大家分享idea中cherry pick的用法,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • 淺談Spring bean 生命周期驗(yàn)證

    淺談Spring bean 生命周期驗(yàn)證

    本篇文章主要介紹了淺談Spring bean 生命周期驗(yàn)證,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • 聊聊springboot?整合?hbase的問(wèn)題

    聊聊springboot?整合?hbase的問(wèn)題

    這篇文章主要介紹了springboot?整合?hbase的問(wèn)題,文中給大家提到配置linux服務(wù)器hosts及配置window?hosts的相關(guān)知識(shí),需要的朋友可以參考下
    2021-11-11

最新評(píng)論