一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - 詳解Java中的線程模型與線程調度

詳解Java中的線程模型與線程調度

2021-08-04 11:10精靈王 Java教程

這篇文章主要介紹了詳解Java中的線程模型與線程調度的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

java線程模型

 

線程的實現主要有3種方式:

  • 使用內核線程實現(1:1)
  • 使用用戶線程實現(1:n)
  • 使用用戶線程加輕量級進程實現(n:m)
  •  

使用內核線程實現(kernel-level thread, klt)(1:1)

內核線程就是直接由操作系統內核支持的線程,這種線程由內核來完成線程的切換,內核通過操作調度器對線程進行調度,并負責將線程的任務映射到各個處理器上。

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

詳解Java中的線程模型與線程調度

優點:

實現簡單

缺點:

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

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

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

狹義上來說,用戶線程指的是完全建立在用戶空間的線程庫上,系統內核不能感知到線程存在的實現。用戶線程的建立、同步、調度和銷毀完全在用戶態完成,不需要內核的幫助。這種線程不需要切換到內核態,所以可以是非常快速且低消耗的,也可以支持更大規模的線程數量。這種進程與用戶線程之間1:n的關系稱為一對多線程模型。

優點:

不需要系統內核線程的支持,用戶線程的很多操作對內核來說都是透明的,不需要用戶態和內核態的頻繁切換,使線程的創建、調度、同步等非常快;

缺點:

  • 需要用戶程序自己處理線程的所有操作,java曾經使用過用戶線程,最終放棄使用。
  • 由于多個用戶線程對應到同一個內核線程,如果其中一個用戶線程阻塞,那么該其他用戶線程也無法執行;
  • 內核并不知道用戶態有哪些線程,無法像內核線程一樣實現較完整的調度、優先級等;

使用用戶線程加輕量級進程實現 n:m)

將內核線程與用戶線程一起使用的組合方式,為n:m的關系,這種就是多對多線程模型。

詳解Java中的線程模型與線程調度

優點:

  • 兼具多對一模型的輕量;
  • 由于對應了多個內核線程,則一個用戶線程阻塞時,其他用戶線程仍然可以執行;
  • 由于對應了多個內核線程,則可以實現較完整的調度、優先級等;

缺點:

實現復雜
go語言中的goroutine調度器就是采用的這種實現方案

java線程的實現

 

在jdk1.2之前,java線程是基于稱為“綠色線程(green thread)”的用戶線程來實現的,而在jdk1.2中,線程模型替換為基于操作系統原生線程模型來實現的。

在目前的jdk版本中,操作系統支持怎樣的線程模型,很大程度上決定了java虛擬機的線程是怎樣映射的,在不同的平臺上實現可能是不一樣的,線程模型只對線程的并發規模和操作成本產生影響,對java程序的編碼和運行過程來說,差異都是透明的。

對于sun jdk 來說,它的windows版本和 linux 版本都是使用的一對一線程模型來實現的,即一條線程就映射到一條輕量級進程中,因為 windows 系統和 linux 系統提供的線程模型都是一對一的。

java線程調度

線程調度是說系統為線程分配處理器使用權的過程。主要的調度方式有兩種:

1.協同式線程調度

線程的執行時間是由線程本身控制的,線程工作執行完成之后,需要主動通知系統切換到另一個線程上。lua 語言中的“協同例程”就是這類實現。

好處:實現簡單

缺點:線程執行時間不可控,可能會一直阻塞,導致系統崩潰

2.搶占式線程調度

每個線程由系統來分配執行時間,線程的切換不由線程本身來決定(在java中,thread.yield() 可以主動讓出cpu使用權,但要獲取,線程本身是沒有任何辦法的)

優點:線程的執行時間系統可控,不會有一個線程阻塞而導致整個進程阻塞

java 使用的是搶占式調度方式

java線程狀態

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

1.新建(new)
創建后尚未啟動的線程所處的狀態
2.運行(runable)
runable 包括了操作系統線程狀態的running 和 ready,也就是處于此狀態的 java 線程可能正在運行,也有可能正在等待分配cpu時間片
3.無限期等待(waiting)
處于這種狀態的線程不會被分配cpu 時間片,需要等待被其他線程顯式地喚醒。
以下方法會讓線程進入到無限期等待:

  • 調用沒有設置 timeout 參數的 object.wait() 方法
  • 調用沒有設置 timeout 參數的 thread.join() 方法
  • 調用locksuport.park() 方法

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

  • thread.sleep() 方法
  • 調用設置了 timeout 參數的 object.wait() 方法
  • 調用設置了 timeout 參數的 thread.join() 方法
  • 調用locksuport.parknanos(long nanos) 方法
  • 調用locksuport.parkuntil(long deadline) 方法

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

以上就是詳解java中的線程模型與線程調度的詳細內容,更多關于java 線程模型與線程調度的資料請關注服務器之家其它相關文章!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人网子 | 97色蜜桃| 微拍秒拍99福利精品小视频 | 污文啊好棒棒啊好了 | 侵犯小男生免费视频网站 | 国产精品亚洲综合第一区 | 天天色综合色 | 精品久久久久久亚洲 | 国内精品久久久久久久久 | 亚洲欧美乱 | 亚洲高清在线天堂精品 | 女同全黄h全肉动漫 | 色批网站www| 深夜在线看 | 亚洲精品一区二区三区在线播放 | 九九国产视频 | 三级午夜宅宅伦不卡在线 | 日本中文字幕一区二区高清在线 | 美女脱了内裤让男桶爽 | 黑人粗长巨茎小说 | 亚州人成网在线播放 | 四虎在线精品免费高清在线 | a级在线看 | 久青草国产观看在线视频 | 美女扒开屁股让男人进去 | 婷婷在线成人免费观看搜索 | 蜜桃视频在线观看www | 32pao强力打造免费高速高 | 欧美8x8x | 2019国内精品久久久久久 | 黑帮少爷爱上我第8集最新 荷兰精品女人性hd 和日本免费不卡在线v | 久久热国产在线视频 | 婷婷色在线观看 | 卫生间被教官做好爽HH视频 | 99re7在线精品免费视频 | 19+韩国女主播激情vip视频在线 | chinese一bdsmⅹxx| 99午夜高清在线视频在观看 | 九九国产在线观看 | 婷婷色在线 | 欧美日韩不卡视频 |