1. 程式人生 > >Java學習筆記之——執行緒的生命週期、執行緒同步

Java學習筆記之——執行緒的生命週期、執行緒同步

一. 執行緒的生命週期

新建(new Thrad):建立執行緒後,可以設定各個屬性值,即啟動前 設定

就緒(Runnable):已經啟動,等待CPU調動

執行(Running):正在被CPU排程

阻塞(Blocked):因為一些原因,暫時不能繼續執行

死亡(Dead):執行緒程式碼執行結束,正常死亡,也可能是非正常

 

 

1.執行緒阻塞

sleep(long millis, int nanos)

導致正在執行的執行緒以指定的毫秒數加上指定的納秒數來暫停(臨時停止執行),這取決於系統定時器和排程器的精度和準確性。

 

練習:列印時間,每個一秒重新整理一次,共列印十次

 

 

2.更改執行緒優先(瞭解)

其實更改優先順序作用並不是那麼明顯,瞭解即可

setPriority(int newPriority)

更改此執行緒的優先順序。1-10(MIN_PRIORITY:1,MAX_PRIORITY:10)

                    NORM_PRIORITY:5  預設優先順序

getPriority()

返回此執行緒的優先順序。

3.停止本次排程,CPU重新分配排程(瞭解)

yield()

對排程程式的一個暗示,即當前執行緒願意產生當前使用的處理器。

4.等待執行緒終止(瞭解)

yield()

對排程程式的一個暗示,即當前執行緒願意產生當前使用的處理器。

5.強制停止執行緒(不建議使用)

stop()

已棄用

這種方法本質上是不安全的。 使用Thread.stop停止執行緒可以解鎖所有已鎖定的監視器(由於未ThreadDeath ThreadDeath異常在堆疊中ThreadDeath的自然結果)。 如果先前受這些監視器保護的任何物件處於不一致的狀態,則損壞的物件將變得對其他執行緒可見,可能導致任意行為。 stop許多用途應該被替換為只是修改一些變數以指示目標執行緒應該停止執行的程式碼。 目標執行緒應該定期檢查此變數,如果變量表示要停止執行,則以有序方式從其執行方法返回。 如果目標執行緒長時間等待(例如,在interrupt變數上),則應該使用interrupt方法來中斷等待。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?

 。

6.中斷執行緒(瞭解)

interrupt()

中斷這個執行緒。

總結:

停止執行緒:stop()  不推薦

       Interrupt()  不推薦

  通過迴圈條件進行控制,相對溫柔

 

二. 執行緒同步

1.執行緒同步:

多個執行緒同時修改競爭資源(同一個資源),通過不控制,可能引起以外的結果

2.為什麼需要執行緒同步?

---執行緒同步是為了防止多個執行緒訪問同一個資料物件時,對資料造成破壞

---執行緒同步是保證多執行緒訪問競爭資源的一種手段

3.同步和鎖定

Java中每一個物件都有一個內建鎖

可以在整個方法或者程式碼塊上新增向某個物件鎖的語法

只有獲取了這個物件鎖,才能執行程式碼,否則一隻阻塞,等到接到鎖位置

 

方法一 :在方法上加借鎖:synchronized

public synchronized void test(){

 

}

 

方法二:在程式碼塊上加借鎖:向指定物件借鎖

 

 

Java程式碼同步:

1) 屬性私有化

2) 所有修改這個屬性的方法都加synchronized同步

死鎖:

比如:執行緒一獲取物件一的鎖,執行緒一獲取物件二的鎖

     執行緒二獲取物件二的鎖,執行緒二獲取物件一的鎖

  

 

4.執行緒通訊

Object類:

wait():物件.wait(),是執行這段程式碼的當前執行緒阻塞,同時會釋放剛剛這個物件借的鎖,一直等到其他地方呼叫這個物件的notify()或者notifyAll()喚醒執行緒並再次拿到鎖,繼續執行下去

notify():物件.notify(),喚醒一個其它地方通過物件.wait()阻塞的執行緒,此時執行緒還不能向下執行,還需要這個物件上的鎖

notifyAll():物件.notifyAll(),喚醒所有其它地方通過物件.wait()阻塞的執行緒,此時執行緒還不能向下執行,還需要這個物件上的鎖