2011-11-12 344 views
4

我在一次採訪中被問到這個問題 - 不確定它是否有意義。單線程執行完成

你有幾個線程相同的優先級開始和運行,你如何確保其中一個特定的線程先運行到完成?

不能使用wait()和睡眠()招對其他線程..

編輯: 修改其他線程是不允許的。

+0

是否在線程中將setpriority()設置爲max的規則? – dbjohn

+0

@dbjohn - 不能改變優先級 –

+1

@dbjohn改變優先級並不能保證任何東西。 –

回答

1

它過時,本身就是不安全的(所以你不應該使用它),但你可以suspend()所有其他線程,然後join()你想獲得第一,然後resume()之一。

我不確定這是他們要做什麼。如果是這樣,我會懷疑他們的面試技巧或他們的Java知識。

我能想到的「好」解決方案至少需要修改線程將要運行的代碼。您確定修改這些線程的限制嗎?

+0

是的。如果我說得對,這個問題的形成方式就是禁止修改線程。我被給了一個暗示,如果我能從JVM的角度做任何事情。 –

+0

@johnbk,任何你可以從「JVM視角」改變的東西都需要改變或添加代碼。 –

6

有一個線程join()其他

+0

這將需要修改您嘗試控制的線程。 –

+2

它只需要改變等待線程的代碼。 –

2

因爲你是不允許修改的線程,你將不得不暫停等待的線程和join()的線程必須首先完成。


我會留下以下的完整性(我澄清有關修改線程加入之前回答),但在這個問題的明確限制,這些方法將被禁止:

有各其他線程在首先完成的線程上調用join()。這將導致他們等待該線程終止,但使用比sleep()循環少得多的CPU時間。

Thread first = new FirstThread(); 
Thread after1 = new AfterThread(first); 
Thread after2 = new AfterThread(first); 

在爲AfterThread run方法:

first.join(); 
// Do the rest of this thread's code 

您也可以通過超時加入()。

另一種方法可能是創建一個只有特定命名線程才能獲取的鎖,直到該命名線程獲取並釋放一次之後。

相關問題