好程式設計師Java培訓告訴你Java-執行緒怎麼來的?
好程式設計師Java培訓告訴你Java-執行緒怎麼來的?併發處理的廣泛應用是使得amdahl定律代替摩爾定律成為計算機效能發展源動力的根本原因,是人類壓榨計算機運算能力的最有力武器。
併發並非一定得用多執行緒,多程式也可以,不過java裡面談論併發,大多數與執行緒脫不開關係。因此我們從執行緒說起。好程式設計師小編主要在本文介紹了以下內容:
執行緒的實現 執行緒的排程 執行緒狀態切換
執行緒的實現
執行緒是比程式更輕量級的排程執行單位,在linux裡面,執行緒和程式沒有什麼區別,唯一的就是在地址空間,執行緒的切換虛擬記憶體空間依然是相同的,但是程式切換是不同的。
目前主流的作業系統都提供的執行緒實現,java則提供的執行緒實現方法都是native的,因為不同的硬體和作業系統提供執行緒排程方式並不盡相同,所以java沒用採用和平臺無關的統一手段來實現。
實現執行緒的主要3種方式:使用核心執行緒實現,使用使用者執行緒實現,使用使用者執行緒加輕量級程式混合實現。
核心執行緒實現
核心執行緒(KLT)就是直接由作業系統核心支援的執行緒,這種執行緒由核心來完成執行緒切換。
程式一般不會直接使用核心執行緒,而是去使用核心執行緒的一種高階介面—輕量級程式(LWP),輕量級程式就是我們所講的執行緒,這種輕量級程式與核心執行緒之間1:1的對應關係。
優點:
核心直接支援,由作業系統核心建立和撤銷。核心維護程式及執行緒的上下文資訊以及執行緒切換。一個核心執行緒由於I/O操作而阻塞,不會影響其它執行緒的執行。
缺點:
1、執行緒的操作、建立、同步等都需要系統呼叫,而系統呼叫代價比較高,需要在使用者態和核心態中來回切換。
2、每個輕量級的程式都需要一個核心執行緒來支援,需要消耗一定的核心資源。
使用者執行緒實現
使用者執行緒指不需要核心支援而在使用者程式中實現的執行緒,其不依賴於作業系統核心,應用程式利用執行緒庫提供建立、同步、排程和管理執行緒的函式來控制使用者執行緒。
不需要使用者態/核心態切換,速度快,作業系統核心不知道多執行緒的存在,因此一個執行緒阻塞將使得整個程式(包括它的所有執行緒)阻塞。使用使用者執行緒實現的程式一般都比較複雜,java曾經用過,不過最後還是放棄了。
優點:
切換由使用者態程式自己控制核心切換,不需要核心干涉,少了進出核心態的消耗。
缺點:
多核處理器很難講執行緒對映到其他處理器上,單執行緒阻塞會造成該程式阻塞。
使用者執行緒加輕量級程式混合實現
這種混合模式下,既存在使用者執行緒,也存在輕量級程式。使用者執行緒還是完全建立在使用者空間中,因此使用者執行緒的建立、切換、析構等依然廉價,可以支援大規模的使用者執行緒併發。
作業系統提供支援的輕量程式作為使用者執行緒和核心執行緒之間的橋樑,使用者執行緒的系統呼叫要透過輕量級執行緒來完成,大大降低了程式阻塞的風險。使用者執行緒和輕量級程式比是N:M多對對的關係。
java在jdk 1.2之前基於使用者執行緒實現,在1.2之後,基於作業系統的原生執行緒模型來實現,在每個平臺上都不盡相同,比如在windows和linux下都是採用一對一的執行緒模型實現,在Solaris平臺,採用都是一對一或者多對多來實現(solaris 同時支援一對一和多對多)。
執行緒排程
執行緒排程主要是指系統為執行緒分配處理器使用權的過程,主要分為:協同式執行緒排程和搶佔式執行緒排程。
協同式排程
協同式排程中執行緒的執行時間由執行緒本身來控制,執行緒把自己的工作執行完成以後,主動通知系統切換到另一個執行緒上。像lua的“協同歷程”就是如此實現的。
優點:
實現簡單,執行緒把自己的事情幹完後進行執行緒切換,切換操作對執行緒自己是可知的。無同步問題
缺點:
執行緒執行時間不可控制,如果某個執行緒出現問題阻塞,會造成程式阻塞。
搶佔式執行緒排程
搶佔式執行緒排程中每個執行緒由系統來分配執行時間,執行緒的切換不由執行緒本身來決定。
優點:
執行緒的執行時間系統可控,不會出現單個執行緒阻塞造成整個程式阻塞。
java就是採用搶佔式執行緒排程,另外,java還可以透過給執行緒設定優先順序來建議系統給某些執行緒多分配一點時間,不過不是很靠譜,執行緒的排程最終還是取決的作業系統。
狀態轉換
java定義了5中執行緒狀態,任意一個時間點,一個執行緒有且只有其中一個狀態。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913864/viewspace-2723426/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java培訓分享Java多執行緒程式設計師Java執行緒
- 好程式設計師Java培訓分享Java多執行緒併發程式設計師Java執行緒
- 好程式設計師Java培訓分享四種常用執行緒池介紹程式設計師Java執行緒
- 好程式設計師Java培訓分享Java多執行緒常見面試問題程式設計師Java執行緒面試
- 好程式設計師Python培訓分享Python中程式和執行緒詳解程式設計師Python執行緒
- 好程式設計師Java培訓分享Java的三大框架怎麼學?程式設計師Java框架
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- Java-基礎程式設計-多執行緒Java程式設計執行緒
- 好程式設計師Java培訓分享Java包是什麼?程式設計師Java
- 好程式設計師Java培訓分享學Java程式設計要注意什麼程式設計師Java
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java培訓Java程式設計師必學技術程式設計師Java
- 好程式設計師Java培訓分享BigDecimal的用法程式設計師JavaDecimal
- 好程式設計師Java培訓分享Java程式設計師常用的工具類庫程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -YAML程式設計師JavaSpring BootYAML
- 好程式設計師告訴你Java架構師學習路線程式設計師Java架構
- 一個故事告訴你什麼才是好的程式設計師程式設計師
- 好程式設計師Java培訓分享Spring Ioc的原理程式設計師JavaSpring
- 好程式設計師Java培訓分享學Java需要什麼基礎?程式設計師Java
- 好程式設計師Java培訓分享面試Java要注意什麼程式設計師Java面試
- 好程式設計師Java培訓分享20個Java程式設計師基礎題程式設計師Java
- 好程式設計師Java培訓分享如何快速入門Java程式設計程式設計師Java
- 好程式設計師Java培訓分享maven-概述程式設計師JavaMaven
- Java程式設計師培訓班哪家比較好Java程式設計師
- 好程式設計師Java培訓分享Java和HTML的區別?程式設計師JavaHTML
- 好程式設計師Java培訓分享Java EE與Java的區別程式設計師Java
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java培訓分享如何快速入門Java程式設計師Java
- 好程式設計師Java培訓分享本地快取如何設計程式設計師Java快取
- 好程式設計師Java培訓幫你整理Java入門常用工具程式設計師Java
- 好程式設計師Java培訓分享SpringBoot -啟動流程程式設計師JavaSpring Boot
- 好程式設計師Java培訓分享For迴圈詳解程式設計師Java
- 好程式設計師Java培訓分享SpringBoot入門篇程式設計師JavaSpring Boot
- java培訓分享:Java程式設計師職業規劃怎麼做Java程式設計師
- 好程式設計師web前端培訓分享怎樣學好css?程式設計師Web前端CSS
- 好程式設計師Java培訓分享面試Java的注意事項程式設計師Java面試
- 好程式設計師Java培訓分享Java集合的兩種排序方法程式設計師Java排序
- 好程式設計師Java培訓Java最常用的五個註解程式設計師Java