在學習運算子時,讀者知道各個運算子之間有優先順序,了解運算子的優先順序對程式幵發有很好的作用。執行緒也是如此,每個執行緒都具有優先順序,Java 虛擬機器根據執行緒的優先順序決定執行緒的執行順序,這樣使多執行緒合理共用 CPU 資源而不會產生衝突。
優先順序概述
在 Java 語言中,執行緒的優先順序範圍是 1~10,值必須在 1~10,否則會出現異常;優先順序的預設值為 5。優先順序較高的執行緒會被優先執行,當執行完畢,才會輪到優先順序較低的執行緒執行。如果優先順序相同,那麼就採用輪流執行的方式。
可以使用 Thread 類中的 setPriority() 方法來設定執行緒的優先順序。語法如下:
public final void setPriority(int newPriority);
如果要獲取當前執行緒的優先順序,可以直接呼叫 getPriority() 方法。語法如下:
public final int getPriority();
使用優先順序
簡單了解過優先順序之後,下面通過一個簡單的例子來演示如何使用優先順序。
例 1
分別使用 Thread 類和 Runnable 介面建立執行緒,並為它們指定優先順序。
(1) 建立繼承自 Thread 類的 FirstThreadInput 類,重寫該類的 run() 方法。程式碼如下:
package ch14;
public class FirstThreadInput extends Thread
{
public void run()
{
System.out.println("呼叫FirstThreadInput類的run()重寫方法"); //輸出字串
for(int i=0;i<5;i++)
{
System.out.println("FirstThreadInput執行緒中i="+i); //輸出資訊
try
{
Thread.sleep((int) Math.random()*100); //執行緒休眠
}
catch(Exception e){}
}
}
}
(2) 建立實現 Runnable 介面的 SecondThreadInput 類,實現 run() 方法。程式碼如下:
package ch14;
public class SecondThreadInput implements Runnable
{
public void run()
{
System.out.println("呼叫SecondThreadInput類的run()重寫方法"); //輸出字串
for(int i=0;i<5;i++)
{
System.out.println("SecondThreadInput執行緒中i="+i); //輸出資訊
try
{
Thread.sleep((int) Math.random()*100); //執行緒休眠
}
catch(Exception e){}
}
}
}
(3) 建立 TestThreadInput 測試類,分別使用 Thread 類的子類和 Runnable 介面的物件建立執行緒,然後呼叫 setPriority() 方法將這兩個執行緒的優先順序設定為 4,最後啟動執行緒。程式碼如下:
package ch14;
public class TestThreadInput
{
public static void main(String[] args)
{
FirstThreadInput fti=new FirstThreadInput();
Thread sti=new Thread(new SecondThreadInput());
fti.setPriority(4);
sti.setPriority(4);
fti.start();
sti.start();
}
}
(4) 執行上述程式碼,執行結果如下所示。
呼叫FirstThreadInput類的run()重寫方法
呼叫SecondThreadInput類的run()重寫方法
FirstThreadInput執行緒中i=0
SecondThreadInput執行緒中i=0
FirstThreadInput執行緒中i=1
FirstThreadInput執行緒中i=2
SecondThreadInput執行緒中i=1
FirstThreadInput執行緒中i=3
SecondThreadInput執行緒中i=2
FirstThreadInput執行緒中i=4
SecondThreadInput執行緒中i=3
SecondThreadInput執行緒中i=4
由於該例子將兩個執行緒的優先順序都設定為 4,因此它們互動占用 CPU ,宏觀上處於並行執行狀態。
重新更改 ThreadInput 類的程式碼、設定優先順序。程式碼如下:
fti.setPriority(1);
sti.setPriority(10);
重新執行上述程式碼,如下所示。
呼叫FirstThreadInput類的run()重寫方法
呼叫SecondThreadInput類的run()重寫方法
FirstThreadInput執行緒中i=0
SecondThreadInput執行緒中i=0
SecondThreadInput執行緒中i=1
SecondThreadInput執行緒中i=2
SecondThreadInput執行緒中i=3
SecondThreadInput執行緒中i=4
FirstThreadInput執行緒中i=1
FirstThreadInput執行緒中i=2
FirstThreadInput執行緒中i=3
FirstThreadInput執行緒中i=4