Java中的執行緒-1

weixin_33670713發表於2018-05-10

支援多執行緒程式設計是Java語言不同與其他語言的優點。

1 :什麼是執行緒?

    在回答這個問題之前,先要了解什麼是程式。

    程式是程式在資料集合上的一次執行過程,是資源申請,排程和獨立執行的單位。(現在是不是有點暈,沒事,舉個列子就理解了)比如:在電腦中你可以同時開啟QQ,播放器等等應用程式。實際在作業系統中就是建立了對應的程式。對於單CPU的計算機來講,同一時刻只有一個程式在運作,不是全部運作,它們是通過短時間的交替來執行。時間比較短,所以就感覺是一塊執行。

執行緒是程式的基本單位。是一個獨立執行線索,一個程式最少包含一個執行緒。程式執行時,真正起作用的是執行緒。執行緒又稱為輕量級程式,它和程式一樣擁有獨立的執行控制,不一樣的是執行緒沒有獨立的儲存空間,和所屬程式中其他執行緒公用一個儲存空間。

2 : 執行緒的概念模型

    a:虛擬的CPU(封裝在java.lang.Thread類)

    b:CPU所執行的程式碼

    c:CPU所需要的變數

3:執行緒的建立

    有兩種方式

    a:繼承Thread類。

    b:實現Runnable介面。

4 :Thread類中的主要方法

public Thread()——構造方法,建立一個Thread物件,名字預設為Thread-n,根據建立的先後順序。n從0開始。

public Thread(String name)——構造方法,建立一個名字為name的Thread物件

public Thread(Runnable target)——構造方法,建立一個新的實現Runnable介面的執行緒類,

public Thread(Runnable target ,String name)——構造方法,建立一個新的實現了Runnable介面的執行緒類,同時設定名字為name

public long getId()——返回該執行緒的唯一ID

public void run()——執行緒體,此執行緒所有的程式碼都在其中寫。此方法不能被顯性呼叫,只能由JVM呼叫,呼叫執行緒的start()方法時,JVM會呼叫run()方法。

public void start()——呼叫此方法,JVM會呼叫run() 方法。

public void join()——當前執行緒執行某一執行緒的此方法,當前執行緒等到該執行緒執行完後才能執行

public static void slep(long mills)——執行緒休眠,休眠時間為mills,休眠時不釋放所佔有的資源.

public static void yield()——暫停當前正在執行的執行緒物件,並執行其他執行緒。該執行緒直接進入就緒狀態。

這是主要的幾個,還有好多的方法參考javaAPI

這個例子是繼承Thread


8948318-75b087b643c39d94.png

這個例子是實現Runnable介面

(實現Runnable介面的類,稱為執行緒類,這個類是不能作為執行緒啟動的,必須通過Thrad構造方法進行“深加工”後在可以。這個方法可以創造多個執行緒物件,但執行的執行緒體都是一樣的。)

8948318-b7ea4d9a919eca84.png



5 : 執行緒的狀態

    三個階段

    a:新建(New)new 出一個新物件

    b:   就緒 (Runnable)  新建狀態的物件呼叫start()方法,物件進入就緒狀態。

    c:執行 (Running)  就緒狀態的物件,獲得CPU分配的時間片進入執行狀態,處於執行狀態的物件,可以通過不同的方式進入不同的狀態。

    d:   阻塞 (Blocked)。阻塞分為三個狀態 wait等待池阻塞(Blocked in object wait pool) lock等待池阻塞(Blocked in lock pool)和其他阻塞(Otherwise Blocked)

    e:死亡 (Dead)

狀態轉移具體如下    

    1.處於執行狀態的執行緒物件的run()或著main()方法結束後,執行緒就進入死亡(程式執行完成而執行終止)狀態

    2.處於執行狀態的執行緒物件,當執行緒物件呼叫了自身的sleep()方法或者其他的執行緒的jion()方法,或者發出I/O請求,就會進入阻塞狀態(該狀態即停止當前執行緒,但並不會釋放自己擁有的資源)當sleep()結束或者jion()結束或者I/O操作結束後 或者 呼叫執行緒的interupt方法,該執行緒進入就緒狀態,繼續等待OS分配時間塊。

    3.處於執行狀態的執行緒物件,當執行緒呼叫yield()方法,放棄當前獲得的CPU時間片,或者時間片用完執行緒還沒結束,執行緒物件回到就緒狀態,這時與其他程式處於同一起跑線,OS可能會繼續讓他進入執行狀態。

 4.當執行緒物件剛進入執行狀態,但還沒執行,發現執行緒執行需要的資源被(synchronized)同步,並獲取不到鎖標記,將會立即進入阻塞(鎖等待池)狀態,登臺獲取鎖標記,一旦執行緒獲得標記,就進入就緒狀態,等待OS分配CPU時間片。

5.處於執行狀態的執行緒物件,當執行緒呼叫wait()方法後,會進入阻塞(等待佇列)狀態,釋放它所佔有的資源,這個狀態不能主動喚醒,必須依靠其他執行緒呼叫notify()或者notifyAll()方法,才能被喚醒。由於notify只能喚醒一個執行緒,但不能確定具體喚醒的是哪一個執行緒,一般呼叫notifyAll()方法,執行緒喚醒後進入鎖池,等待獲取鎖標記。

相關文章