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