2010-07-23 169 views
4

如果我想讓 設置一個優先級爲最小值和最大值的線程,在Linux下使用線程創建Java應用程序?線程優先級

在Windows中,範圍從0(最低)到31(最高)。

+0

[在Linux中的Java線程的優先級(http://stackoverflow.com/questions/128039) – krock 2010-07-23 12:18:32

回答

0

-20(最高)至+20(最低),默認爲0。 但是,如果您不是root用戶,則不能將nice值增加負值。 (例如,通過-7遞增5的好值將被忽略,因爲您通常沒有獲得這樣的權限)。

EDIT看到https://stackoverflow.com/questions/128039/java-threads-priority-in-linux

+1

我認爲你與混亂Linux的線程/進程優先級的可能重複Java線程優先。 Java允許您將Java線程優先級設置爲從MIN_PRIORITY到MAX_PRIORITY的任何值。這些值如何映射到本地線程優先級是......在這裏不相關。 – 2010-07-23 12:34:18

+0

值從-20(最高)到19(最低) – xdevel2000 2010-07-23 13:04:17

+0

@Stephen C在閱讀更多的答案和評論後,他確實*想知道這些值是如何映射的(這是JVM特有的)。 (不,我沒有混淆它 - Java *是獨立於平臺的,並且使用操作系統特定的參數是沒有意義的。) – Tedil 2010-07-23 14:12:32

5

在Java它是從Thread.MIN_PRIORITY到Thread.MAX_PRIORITY沒有定義的範圍的,因爲它依賴於底層操作系統和/或JVM上。

爲了提高性能,如果您在不同優先級的線程之間共享資源,可能會遇到優先級反轉問題。那就是當一個低優先級的線程持有一個具有高優先級線程的資源在等待它。那麼高優先級的線程可能會等待很長時間。

+4

'MIN_PRIORITY'和'MAX_PRIORITY' [* do * have defined values](http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/constant-values.html#java.lang .Thread.MIN_PRIORITY)。他們分別是1和10。實現定義的事情是這些級別如何映射到實際的操作系統的prioerity水平! – 2010-07-23 13:07:43

+0

@JoachimSauer鏈接已損壞。 – 2015-02-15 21:12:58

3

Thread類有兩個靜態int字段:MIN_PRIORITYMAX_PRIORITY,其實際值潛在的(如果不是實際上)平臺專用110。從理論上講,這些值在未來的Java發行版中可能會發生變化。但是,這是不太可能的,至少因爲這樣的改變會破壞二進制兼容性。 (原始常量的值可能會綁定到在編譯時使用它的代碼。)無論哪種方式,在(例如)setPriority方法的規範中隱含MIN_PRIORITY的值將小於或等於MAX_PRIORITY的值。

編輯

啊...所以你真的如何在Java優先值(例如Thread.MIN_PRIORITYThread.MAX_PRIORITY)映射到Linux原生線程的優先級知道:

  • 再次,優先級映射可以是平臺/ JVM /版本特定的。 Sun不指定它們是什麼。

  • 很難確定純Java應用程序中的優先級映射。

  • 實驗上,您可以通過設置各種Java線程優先級並查看相應的Linux本機線程優先級來映射出映射。 (可能有某種方法可以讓ps命令打印出線程優先級。)

  • 或者,您可以下載並閱讀OpenJDK源代碼(用於您的版本/平臺)以查看Java運行時實際執行的操作。

編輯2

事實上,根據this page,Java優先級的天然線程的優先級的映射依賴於(並且可以使用顯式地設置)熱點-XX Java選項。 (搜索頁面的「優先級」。)

+0

我的問題是關於當我使用MAX_PRIORITY設置setPriority時由JVM映射的Linux系統上的值! – xdevel2000 2010-07-23 12:24:01

+0

@ xdevel2000 - 唯一100%可靠的答案是使用已安裝的JVM **打印出這些常量**的值,並且不要假設它們在另一個JVM上是相同的。 – 2010-07-23 12:28:37

+0

@ xdevel2000:你的問題並沒有真正解釋你對從Java值到Linux內核值的映射感興趣。也許你應該通過更新你的問題來擴展它。 – 2010-07-23 13:10:08

1

您是否嘗試過使用常量從Thread.MIN_PRIORITYThread.MAX_PRIORITY來定義線程的優先級?

1

值得注意的是,線程優先級只是一個在Linux上被忽略的提示,除非你是root用戶,並且只能在Windows上降級。

總之,你不應該編寫你的程序來依賴線程優先級的行爲。無論你想要做什麼,最好以另一種方式完成。

0

使用setPriority,優先級級別從1(最不重要)到10(最重要)的範圍,如果沒有明確設置級別,默認情況下優先級爲5。

還要檢查常量MAX_PRIORITYMIN_PRIORITY