假設您有一個程序啓動兩個線程a
和b
,並且b
啓動另外10個線程。 a
是否獲得了「關注」的一半,而b
及其線索分享另一半,還是他們都平等分享?如果默認情況下答案是後者,你怎麼能達到前者?謝謝!線程內線程的優先級
回答
是否
a
收到可用「注意」的一半,而b
及其線程共享的另一半,還是他們都平等地分擔?
都沒有。每個線程收到的時間比例是未指定的,並且沒有可靠的方法來在Java中進行控制。這取決於本地線程調度程序。
如果默認回答是後者,那麼您如何實現前者?
你不能,可靠。
您必須影響每個線程運行的相對時間量的唯一因素是線程優先級。即使它們不可靠或不可預測。 javadoc簡單地說高優先級的線程被執行「優先於」低優先級的線程。實際上,這取決於本地線程調度程序如何處理優先級。
欲瞭解更多詳情:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/thread-priorities.html ...其中包括有關如何在一系列平臺和Java版本上的線程優先級信息。
關於此主題有很多不錯的文檔。其中一個是this。
創建Java線程時,它從創建它的線程繼承它的優先級。您也可以使用setPriority()方法隨時修改線程的優先級。線程優先級是範圍在MIN_PRIORITY和MAX_PRIORITY之間的整數(在Thread類中定義的常量)。整數越高,優先級越高。在任何給定的時間,當多個線程準備好執行時,運行時系統選擇具有最高優先級的「Runnable」線程來執行。只有當該線程停止,退出或由於某種原因變爲「不可運行」時,纔會開始執行較低優先級的線程。如果兩個具有相同優先級的線程正在等待CPU,那麼調度器會選擇其中一個以循環方式運行。所選擇的線程將運行,直到滿足下列條件之一爲真:
- 較高優先級的線程變爲「可運行」。
- 它產生,或其run()方法退出。
- 在支持時間分片的系統上,其分配時間已過期。
在任何給定時間,最高優先級的線程正在運行。但是,這不能保證。線程調度器可以選擇運行較低優先級的線程以避免飢餓。出於這個原因,爲了提高效率,僅使用優先級來影響調度策略。 不要依賴線程優先級來保證算法的正確性。
+1,'不要依賴線程優先級爲算法的正確性'。 – 2013-04-30 11:05:55
+1經典解釋 – 2013-05-01 08:33:08
我們不能說線程將執行的順序。線程調度程序按照我們無法改變的內置算法工作。線程調度程序從可運行池中選取任何線程(最高優先級線程)並使其運行。 我們只能提到調度程序應該處理我們的線程的優先級。
- 1. 線程優先級
- 2. 流程優先與線程優先級
- 3. Android的線程優先級
- 4. 線程優先級的Android
- 5. 更改線程優先級
- 6. 通過了解線程的優先級來設置線程的優先級
- 7. Java中的高優先級線程
- 8. 線程消息之間的優先級?
- 9. 線程的延遲優先級更改
- 10. 降低Task.Factory.StartNew線程的優先級
- 11. NSOperationQueue VS並行線程的優先級
- 12. ThreadPoolExecutor和Android的線程優先級
- 13. .NET Backgroundworker對象的線程優先級
- 14. 具有優先級設置的線程
- 15. 線程 - 優先級突發事件與優先級
- 16. 線程池中的C#低線程優先級
- 17. 線程同步和設置線程的優先級
- 18. 一個簡單的線程在碳庫++與線程優先級
- 19. 什麼是UI線程的線程優先級?
- 20. Iphone線程優先
- 21. 優先化線程。
- 22. Java線程優先
- 23. 線程,優先級和放棄
- 24. C++線程網絡優先級
- 25. 光標時鐘和線程優先級
- 26. Windows和Linux線程優先級等價
- 27. 更改線程優先級 - Unity 3d
- 28. 更改線程優先級ERROR_INVALID_HANDLE
- 29. 線程安全優先級隊列
- 30. 設置CoreData NSManagedObjectContext線程優先級
向下選民 - 你願意解釋嗎? – 2013-04-30 13:16:58