天天看點

java的多線程及其意義什麼是線程為什麼要多線程機制

什麼是線程

所謂線程,指的是一個動态執行的過程,它有一個從産生到死亡的過程。 一條線程指的是程序中一個單一順序的控制流,一個程序中可以并發多個線程,每條線程并行執行不同的任務。多線程是多任務的一種特别的形式,但多線程使用了更小的資源開銷。

為什麼要多線程機制

所謂多線程,簡單說就是這個程式(一個程序)運作時産生了不止一個線程。

用多線程隻有一個目的,那就是更好的利用cpu的資源,因為所有的多線程代碼都可以用單線程來實作。說這個話其實隻有一半對,因為反應“多角色”的程式代碼,最起碼每個角色要給他一個線程吧,否則連實際場景都無法模拟,當然也沒法說能用單線程來實作。

再介紹下并行與并發:

并行:多個cpu執行個體或者多台機器同時執行一段處理邏輯,是真正的同時。

并發:通過cpu排程算法,讓使用者看上去同時執行,實際上從cpu操作層面不是真正的同時。并發往往在場景中有公用的資源,那麼針對這個公用的資源往往産生瓶頸,我們會用TPS或者QPS來反應這個系統的處理能力。

這裡,我用一張圖作為反映多線程的例子。

java的多線程及其意義什麼是線程為什麼要多線程機制

大緻的過程可以這麼分:

1、建立狀态(New):新建立了一個線程對象。

2、就緒狀态(Runnable):線程對象建立後,其他線程調用了該對象的start()方法。該狀态的線程位于可運作線程池中,變得可運作,等待擷取CPU的使用權。

3、運作狀态(Running):就緒狀态的線程擷取了CPU,執行程式代碼。

4、阻塞狀态(Blocked):阻塞狀态是線程因為某種原因放棄CPU使用權,暫時停止運作。直到線程進入就緒狀态,才有機會轉到運作狀态。阻塞的情況分三種:(一)、等待阻塞:運作的線程執行wait()方法,JVM會把該線程放入等待池中。(wait會釋放持有的鎖)(二)、同步阻塞:運作的線程在擷取對象的同步鎖時,若該同步鎖被别的線程占用,則JVM會把該線程放入鎖池中。(三)、其他阻塞:運作的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀态。當sleep()狀态逾時、join()等待線程終止或者逾時、或者I/O處理完畢時,線程重新轉入就緒狀态。(注意,sleep是不會釋放持有的鎖)

5、死亡狀态(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。