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()是給其它可運行線程執行的機會。兩者是不同的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章