設定優先順序 執行緒設定那麼高的優先順序,它起作用了嗎?

2021-10-14 16:19:25 字數 2274 閱讀 2115

我們知道在構建乙個執行緒物件的時候可以給執行緒設定乙個優先順序,就像下面這樣:

public class myrunnable implements runnable }
public class myrunnabletest }
或許你曾經有過這樣的想法,如果有多個執行緒的話,是不是可以按照這種優先順序設定的順序來啟動執行緒呢?我們來看下面這個例子:
public class minpriority implements runnable }
public class normalpriority implements runnable }
public class maxpriority implements runnable }
public class threadprioritytest }
我模擬了三個不同優先順序別的執行緒,在構建完成之後「同時」啟動,然後觀察結果。也請你嘗試把這些**拷貝到你的開發工具中,然後嘗試執行「threadprioritytest」,也許第一次你看到的結果是這樣的:
執行緒的優先順序為10執行緒的優先順序為5執行緒的優先順序為1
你會很開心,因為它按照你的預期來輸出了。但是,請嘗試多執行幾次「threadprioritytest」你也許會發現有其他的不同的結果:
執行緒的優先順序為5執行緒的優先順序為10執行緒的優先順序為1
看到上面結果之後,回過頭來看我們最初設定的執行緒的優先順序貌似並沒有起到什麼作用。這到底是為什麼呢?別著急!我們先來過一遍設定執行緒優先順序的原始碼:
public final void setpriority(int newpriority)     if((g = getthreadgroup()) != null)         setpriority0(priority = newpriority);    }}
首先宣告了乙個執行緒組物件,然後

checkaccess()

進行了安全檢查,緊接著就是判斷我們傳遞過來的優先順序的值,判斷它是不是低於最小的優先順序,高於最大的優先順序,如果滿足上述條件的話,就直接丟擲引數不合法的異常。

執行緒thread類提供了三個優先順序的常量:

// 可設定最小優先順序public final static int min_priority = 1;// 預設的優先順序,如果沒設定的話,預設為此值public final static int norm_priority = 5;// 可設定最大優先順序public final static int max_priority = 10;
原始碼中比較重要的就是

((g = getthreadgroup()) != null)

的判斷,第一步先通過

getthreadgroup()

方法獲取到當前的執行緒組賦值給

g

。獲取執行緒組

getthreadgroup()

方法的原始碼如下:

public final threadgroup getthreadgroup()
拿到返回的執行緒組之後判斷我們顯示設定的執行緒優先順序的值是否大於了執行緒組的優先順序,如果大於了,就設定為執行緒組的優先順序。

最後就是通過

setpriority0(priority = newpriority)

方法給執行緒賦值:

private native void setpriority0(int newpriority);
可以看到最後設定執行緒的這個方法是呼叫的本地方法,那麼就是交由底層去實現的。其實執行緒的優先順序設定可以理解為執行緒搶占cpu時間片的概率,雖然概率比較大,但是它不一定就是按照優先順序的順序去搶占cpu時間片的,具體的執行順序還是要根據誰先搶到了cpu的時間片,誰就先來執

因此千萬不要把設定執行緒的優先順序當做是執行緒實際啟動的優先順序哦!

執行緒優先順序的設定

執行緒的優先順序 1 10,10為最高端別,1為最低級別,5為預設級別 thread.min priority 最小優先順序 thread.max priority 最高優先順序 thread.norm priority 預設優先順序 設定優先順序 public class jointhread2 ...

Linux執行緒優先順序設定

本程式會讓系統失去i o響應,不建議去執行!include include include include include include void thr fun void arg if policy sched fifo else if policy sched other else if po...

56 設定執行緒優先順序

可以通過使用thread類中的setpriority方法設定執行緒的優先順序。setpriority 方法接收乙個int型別的引數,通過這個引數可以指定執行緒的優先順序,取值範圍是整數1 10,優先順序隨著數字的增大而增強。在thread類中封裝了三個int型別的數字 優先順序最低 public f...