Java執行緒的優先順序和執行順序

2020-07-16 10:04:38
在學習運算子時,讀者知道各個運算子之間有優先順序,了解運算子的優先順序對程式幵發有很好的作用。執行緒也是如此,每個執行緒都具有優先順序,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