2015-08-08 40 views
0

我們如何確保使用wait, notify(最好)或其他高級構造在Java中的3個或更多線程之間進行排序。在Java中的3個或更多線程中排序

例如,對於3個線程,T1,T2 & T3分別打印1,4,7 ... 2,5,8 ... 3,6,9 ...應該按照T1> T2的順序執行> T3> T1> T2> T3> T1等等... 最終輸出如下所示:

T1 1

T2 2

T3 3

T1 4

T2 5

T3 6

T1 7

請注意沒有。的線程被用作來自用戶的輸入並且不被硬編碼。

我明白,如果要按順序運行多線程沒有意義,但這是一個實踐問題。

請幫助一個代碼片段。

+0

在某處收集結果並對它們進行排序。 –

+0

您的嘗試在哪裏? – SMA

+0

我投票結束這個問題作爲題外話,因爲它是一個家庭作業問題,它不包括迄今爲止解決問題所完成的工作所需的總結,也沒有描述解決它時遇到的困難。 – RealSkeptic

回答

0

如果您有n個線程,則創建一個由n個二進制信號量組成的數組(也稱爲鎖或非遞歸互斥鎖)。信號量[]鎖=新的信號量[n]; 在啓動線程之前,將所有的鎖初始化爲0. 每個線程例程都應該得到它的編號,這樣線程0將有一個局部變量,表示它是線程0. 現在每個線程例程都應該以鎖定開始[¡]。鎖();並以鎖[(i + 1)%n] .unlock()結束;

然後啓動所有線程。並調用鎖[0] .unlock()

這裏的一般想法或配方是線程同步。您首先將鎖初始化爲鎖,然後按照您要創建序列的順序解鎖它們。這與線程保護形成對比,在線程保護中,您通常以處於解鎖狀態的鎖開始,並在您處於關鍵部分時將其鎖定。

回到你的問題,如果你想讓這些線程轉動。你可以這樣做: (JAVA)

void run() 
{ 
    while(isRunning) 
    { 
     lock[i].lock(); 
     ////Your task 
     lock[(i+1)%n].unlock(); 
    } 
} 

因此,例如線程0將得到鎖止單元和塊,直到主線程完成啓動所有線程,當主線程調用鎖[0]。解鎖(),線程0將執行任務,解鎖線程並返回鎖定[0]鎖定,因爲它沒有解鎖它,線程0將等待最後一個線程,它會在程序結束時解鎖它。

編輯:

你可以有一個互斥量和正條件變量類似的解決方案,但這個想法是一樣的。

+2

你有提到「當主線程調用鎖[0] .unlock()時,線程0將執行任務,**解鎖線程**並返回」線程將如何解鎖先前由主線程鎖定的鎖?我相信它不適用於Mutex,因爲只有相同的線程才能鎖定和解鎖互斥鎖。 – sjain

+0

@SaharshJ,你是對的。大多數互斥鎖都是遞歸的,並且由鎖定它的線程擁有。在這裏,我使用「互斥體」作爲二進制信號量,看到這個答案http://stackoverflow.com/a/189778/2777540。我相信pthread和Java Mutex確實是遞歸的。讓我編輯答案以避免混淆,並感謝您的評論 –