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),因為有太多封裝好的類,所以很快你就會忘記了,對於深度封裝的類,不了解基礎又無法深入,所以根本就學不會多線程。  
以上純屬一家之言,如果有理解錯誤的地方,歡迎文明指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM