1. 程式人生 > >Java執行緒之進階篇

Java執行緒之進階篇

一、執行緒的排程

  • 在Java中,執行緒通常是搶先式的,而不是按需分配時間片式的。
  • 在搶先式中,有多個執行緒是“可執行的”,但只有一個執行緒是實際執行的。這個執行緒會一直執行,直到它暫停併成為“可執行態”,或者有更高優先順序的執行緒變為“可執行的”。
  • 一個正在執行的執行緒暫停併成為“可執行態”的這個過程稱為“被阻塞”。被阻塞有許多不同原因。例如執行Thread.sleep()。
  • 可使用靜態方法Thread.currentThread()來獲取對當前執行緒的引用
public class Xyz implements Runnable { 
    public void run() { 
       while
(true) { // lots of interesting stuff // Print name of the current thread System.out.println("Thread" + Thread.currentThread().getName()+ "completed"); } } }
執行緒的生命週期

一個Thread物件在它的生命週期中會處於各種不同的狀態

這裡寫圖片描述

所有“可執行的”執行緒根據不同的優先順序,放在不同的執行緒池裡。

這裡寫圖片描述

二、執行緒的基本控制

1.終止執行緒

當一個執行緒結束執行並終止時,它就不能再運行了。
可以用一個指示run()方法的退出標誌來停止一個執行緒。

2.測試執行緒

使用isAlive()方法用來確定一個執行緒是否仍是活的
“活著的執行緒”表示該執行緒已經開始,而且還沒有死亡
活著的執行緒並不意味著執行緒正在執行;
對於一個已開始執行但還沒有完成任務的執行緒,這個方法返回true。

3.訪問執行緒的優先權

執行緒在建立時,繼承了父類的優先順序。執行緒建立後,可以在任何時刻呼叫setPriority方法改變執行緒的優先順序。優先順序為1~10,Thread定義了其中3個常數:
(1) MAX-PRIORITY最大優先順序(值為10);
(2) MIN-PRIORITY最小優先順序(值為1);
(3) NORM-PRIORITY預設優先順序(值為5)。
使用setPriority()方法設定執行緒當前的優先權

4.延遲執行緒

Thread.sleep()方法是使執行緒停止一段時間的方法。
在sleep時間間隔期滿後,執行緒不一定立即恢復執行。這是因為在那個時刻,其它執行緒可能正在執行而且沒有被排程為放棄執行,除非
(a)“醒來”的執行緒具有更高的優先順序
(b)正在執行的執行緒因為其它原因而阻塞

join()和yield()區別

      join()方法使當前執行緒停下來等待,直至另一個呼叫join方法的執行緒終止。可以帶有一個以毫秒為單位的時間值來呼叫join方法,例如:void join (long timeout);其中join()方法會掛起當前執行緒。掛起的時間或者為timeout毫秒,或者掛起當前執行緒直至它所呼叫的執行緒終止。

      使用Thread.yield()方法能給其它可執行執行緒一個執行的機會。如果有其它可執行執行緒存在,則呼叫Thread.yield()的執行緒被放入可執行池中,並允許其它執行緒執行。如果沒有其它可執行執行緒,則yield()方法什麼都不做。

      注意:呼叫sleep()方法是給更低的優先權的執行緒執行的機會;而呼叫yield()是給其它可執行執行緒執行的機會。兩者是不同的。