2014-04-25 56 views
3

當我在java中有一個同步方法,並且如果有多個線程(可以說10個線程)試圖訪問這個方法,並假設某個線程可以訪問此方法並完成方法的執行併發布鎖然後剩下的9個線程中的哪一個可以訪問這個方法?是否有任何標準機制可以通過哪個標準機制從池中選擇下一個線程,還是以FIFO順序選擇它,還是隨機選擇線程?Java中的多線程

+1

我相信這是隨機的,但我可能被誤認爲 – Alejandro

+0

取決於機器本身,儘管根據我的經驗,線程將放入隊列中,所以先進先出 – Rogue

回答

8

Java中的線程調度是特定於平臺的。在同步場景中,不能保證線程執行的順序。

話雖如此,該過程大致如下:採用

    1. 甲搶佔式調度算法中的每個線程由JVM
    2. 與他線程最高優先級被選擇得到了優先級數
    3. FIFO排序之後線程之間具有相同的優先級

    殲VM運行具有最高優先級的線程。優先級也可以通過Thread類的setPriority()方法以編程方式設置。

  • 3

    下一個線程將被隨機選擇,而選擇下一個線程的算法在不同的機器上可能會不同。這對於Java來獲得使用本機線程的效率是必需的。

    如果您需要先進先出行爲,則可能需要使用java.util.concurrent包中的某些內容,例如將公平性設置爲true的Semaphore類。