2013-04-30 218 views
6

假設您有一個程序啓動兩個線程ab,並且b啓動另外10個線程。 a是否獲得了「關注」的一半,而b及其線索分享另一半,還是他們都平等分享?如果默認情況下答案是後者,你怎麼能達到前者?謝謝!線程內線程的優先級

回答

2

是否a收到可用「注意」的一半,而b及其線程共享的另一半,還是他們都平等地分擔?

都沒有。每個線程收到的時間比例是未指定的,並且沒有可靠的方法來在Java中進行控制。這取決於本地線程調度程序。

如果默認回答是後者,那麼您如何實現前者?

你不能,可靠。

您必須影響每個線程運行的相對時間量的唯一因素是線程優先級。即使它們不可靠或不可預測。 javadoc簡單地說高優先級的線程被執行「優先於」低優先級的線程。實際上,這取決於本地線程調度程序如何處理優先級。

欲瞭解更多詳情:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/thread-priorities.html ...其中包括有關如何在一系列平臺和Java版本上的線程優先級信息。

+0

向下選民 - 你願意解釋嗎? – 2013-04-30 13:16:58

5

關於此主題有很多不錯的文檔。其中一個是this

創建Java線程時,它從創建它的線程繼承它的優先級。您也可以使用setPriority()方法隨時修改線程的優先級。線程優先級是範圍在MIN_PRIORITYMAX_PRIORITY之間的整數(在Thread類中定義的常量)。整數越高,優先級越高。在任何給定的時間,當多個線程準備好執行時,運行時系統選擇具有最高優先級的「Runnable」線程來執行。只有當該線程停止,退出或由於某種原因變爲「不可運行」時,纔會開始執行較低優先級的線程。如果兩個具有相同優先級的線程正在等待CPU,那麼調度器會選擇其中一個以循環方式運行。所選擇的線程將運行,直到滿足下列條件之一爲真:

  1. 較高優先級的線程變爲「可運行」。
  2. 它產生,或其run()方法退出。
  3. 在支持時間分片的系統上,其分配時間已過期。

在任何給定時間,最高優先級的線程正在運行。但是,這不能保證。線程調度器可以選擇運行較低優先級的線程以避免飢餓。出於這個原因,爲了提高效率,僅使用優先級來影響調度策略。 不要依賴線程優先級來保證算法的正確性。

+0

+1,'不要依賴線程優先級爲算法的正確性'。 – 2013-04-30 11:05:55

+0

+1經典解釋 – 2013-05-01 08:33:08

0

我們不能說線程將執行的順序。線程調度程序按照我們無法改變的內置算法工作。線程調度程序從可運行池中選取任何線程(最高優先級線程)並使其運行。 我們只能提到調度程序應該處理我們的線程的優先級。