Java多線程概念簡介 多線程中篇(一)

Java的線程與操做系統的線程  
在線程的相關介紹中,有講到「線程的實現」分爲三種:內核支持,用戶級以及二者混合。(這只是一種簡要的分類)
Java線程在JDK1.2以前,是用戶線程實現的
而在JDK1.2中,線程模型變爲基於操做系統原生線程模型來實現的
因此說Java虛擬機中線程的映射實現,是受制於操做系統的,操做系統支持怎樣的線程模型,決定了Java虛擬機中線程的樣子。
虛擬機規範中也並未限定Java線程須要使用哪一種線程模型來實現。
線程模型只對線程的併發規模和操做成本產生影響,對Java程序的編碼和運行過程來講,這些差別都是透明的。
目前由於Windows和Linux系統提供的線程模型就是一對一的,因此對於Sun JDK來講,它的Windows版與Linux版都是使用一對一的線程模型實現的,一條Java線程就映射到一條輕量級進程之中
簡言之,如今的JDK線程模型基於操做系統原生線程,因此模型依賴於操做系統對線程的支持,另外Windows和Linux系統提供的線程模型就是一對一的
因此能夠簡單認爲:
如今Java線程與操做系統線程一對一映射
如今的Java線程,就是操做系統中的線程
至於JVM將Java線程與操做系統的線程是如何映射的?不一樣的操做系統中具體的線程是如何實現的?是另外的兩個很深的問題。
之因此提到Java線程與操做系統線程,實際上是想說,操做系統中將程序的運行抽象爲進程和線程,有一套抽象的理論體系,其實Java線程與他們是同根同源的,核心思惟邏輯是相同的,因此前面簡單瞭解到的操做系統對於進程、線程的相關內容,並非那麼的廢話..... ̄□ ̄||
不過儘管類似之處太多太多,雖同根同源,可是卻又千差萬別,每一個人從生物的角度來講,骨骼多少塊?肌肉多少塊?幾隻眼睛?幾隻耳朵?..儘管這都是相同的,可是每一個人真的同樣麼,脾氣?秉性?能力?...  

一切都是Thread

Thread是Java對線程的抽象描述,因此多線程編程模型必然是針對Thread
無論JVM與操做系統的線程到底如何映射,到底如何運行,面對Java,程序員看到的就只是Thread
代碼中操做的這個Thread類的實例,就比如是操做系統底層線程的一個指針(句柄),你想這個線程怎麼樣,經過操做這個Thread實例對象便可
拋開以前篇章中關於操做系統、進程、線程、同步、控制、死鎖等底層基礎知識的介紹,從Java多線程編程的視角看,咱們就是在操縱不一樣的Thread對象實例,對這些實例進行不一樣的配置,而且讓他們相互協做。
Thread是一個類,用於描述了線程這一律念,Thread有自身的屬性信息好比名稱,這些屬性信息用於描述線程自己或者用於支撐線程能夠操做的行爲。
如同咱們定義一個Person類,這個類擁有一些屬性和方法,而後定義了一些實例對象進行協做。   

多線程開發就是操縱Thread對象

Java多線程程序開發中,程序員建立Thread類的實例,而且對實例進行配置,而後經過可操做的行爲方法對他們進行管理調度,使程序以多線程的形式運行
在神話故事中,女媧娘娘摶土造人,每個人都是「人類」的一個實例,每一個人有姓名性別等屬性信息,「人類」有自身的能力(行走,說話,思考,認知等),經過後天的努力學習也都有各自的能力(線程任務),整個世界由一個個不一樣的人,整個社會的活動由全部的人的相互的行爲交互構成。
對於Java多線程程序開發中的程序員們來講,不就至關於神話故事中的女媧娘娘麼
整個多線程的世界裏面,都是Thread的實例對象,程序員負責建立、配置、管理調度這些對象,也就造成了支持多線程的程序了。
 
儘管多線程編程很是繁瑣、複雜、易錯,可是若是理解清楚了Thread的抽象模型,而且對多線程編程模型中的解決思路熟悉,就可以編寫出來良好的多線程程序。
Thread的抽象模型往簡單了說就是Thread這個類,他有屬性字段,有public方法,也有封裝到線程任務(Runnable),對於一個Thread的設置,他就那些可配置項目,很少很多
因此只要你理解了Thread的的抽象模型,那麼你就可以很清晰的對你須要的Thread進行配置。
而多線程編程模型中的解決思路就如同下棋時的套路那般,可讓你更好更快更全面的寫出來多線程應用程序。
 
因此說,什麼是Java多線程編程?
只有兩個步驟,建立Thread 對象,使用Thread對象,看起來彷佛是超乎尋常的簡單
使用電腦也很簡單,按下電源鍵開機,使用鼠標和鍵盤,提及來也是很是的簡單,可是使用計算機完成工做任務,卻不是一件輕鬆的事情。
多線程不巧的是,也是如此,首先多線程編程模型的概念源於操做系統中的多線程(進程),而後有千差萬別,因此對於Thread抽象模型的理解自己就具備必定的門檻
另外,對於線程的操做有多種方法,既然是多線程就不止一個線程,那麼多線程、多交互方法,必然產生不少種複雜的協做邏輯,如何可以正確高效的組織,也是很是考驗智商的。   

Java線程邏輯

操做系統中咱們對進程進行了介紹,對於進程做爲操做系統對於程序運行的抽象,核心爲進程控制、進程同步、進程通訊
咱們前面有說到Java多線程與操做系統中的線程(進程)同根同源,其實Java的多線程編程模型核心也是這三部分
  • 對於Thread類自己,擁有其自身的屬性,好比名字、Id、優先級、狀態等,這就是進程的控制信息;
  • 對於Thread中封裝的任務,Java提供了synchronized,volatile關鍵字用於控制共享資源的訪問,這就是進程的同步;
  • 對於Thread中的一些行爲(以及從Object繼承而來的),好比join、wait則至關於進程的通訊;
簡言之,Java中對操做系統中的進程的控制、同步、通訊,都有抽象,固然對於Java線程來講,從編程的角度看,他的主宰不是操做系統而是咱們程序員。
因此說繞來繞去,即便咱們說的是Java中的多線程,仍是繞不開「控制、同步、通訊」的概念。
image_5c5bb68d_2e3d

Java多線程編程究竟是什麼

因此說了這麼多,到底Java多線程編程究竟是什麼?咱們前面說只有兩個步驟「建立Thread 對象,使用Thread對象」
這兩個部分是對線程自己的控制與處理,可是在使用Thread對象時,還有一個最重要的部分,也就是爲何咱們要使用線程?
還不是爲了執行任務?
因此說,任務的執行也是很是重要的代碼,由於,多線程中的代碼再也不是簡簡單單的完成任務那麼簡單,由於若是涉及到共享資源的訪問,因此就是涉及到進程同步的問題。
因此想要學習Java多線程,第一個部分,理解清楚Java對線程概念的抽象以及Thread支持的控制操做方法---也就是Thread類自己。
第二個部分,理解清楚Java中同步的邏輯,也就是同步關鍵字的透徹理解。
第三個部分,理解清楚Java對於線程通訊的抽象,也就是相關方法好比wait 的邏輯
以上三個部分就是Java多線程的基礎,若是真的完全理解了,我相信任何人均可以寫出正確的多線程代碼。
可是,誰會非要從鍊鋼開始造汽車?電腦城中組裝電腦的店鋪一大把,誰會本身組裝一個CPU或者風扇?
發展到現在,Java也提供了更多的「工具類」,也不斷有一些好的設計模式與理念產生,因此,想要真的成爲大師,你還要學會用好各類工具,站在前人的肩膀上。
因此,多線程編程的學習如上內容。
在上篇中,對操做系統中關於進程線程的相關概念進行了簡單介紹,以有助於下一步可以快速理解Thread抽象模型
在中篇中,將會詳細介紹Java的多線程編程基礎。
在下篇中將會對多線程編程中的經典模式、工具類進行簡單介紹。   

總結

Java線程與操做系統線程的概念是同根同源的,根本邏輯是一致的,如同你跟另一我的,生物上看都是「人類「,儘管從另外的不少角度大家是千差萬別的。
操做系統是爲了多程序(任務)的併發運行,因此有了進程抽象概念,爲了程序內部更好的併發運行 ,因此有了線程的概念。
他們都是圍繞着併發、提升處理機利用率等目的,他們面對的問題也都是類似的,控制、同步、通訊。
因此Java線程也不例外,Java線程與操做系統關於併發程序進程的相關概念與解決思路也是相通的
因此Java線程對操做系統中的概念進行了抽象,經過Thread類提供的屬性和方法,經過關鍵字,經過Object的通訊方法,完成了對進程概念的完整描述。
因此,回頭再看操做系統中關於控制、同步、通訊的內容,你又會以爲很是有幫助。
多線程的學習很複雜,若是隻是知識點的學習記憶,其實毫無用處,由於首先你不會如此深刻底層原語(好比直接使用wait),由於有太多封裝好的類,因此很快你就會忘記了,對於深度封裝的類,不瞭解基礎又沒法深刻,因此根本就學不會多線程。  
以上純屬一家之言,若是有理解錯誤的地方,歡迎文明指正。
相關文章
相關標籤/搜索