2011-10-11 64 views
0

我正在編寫一個應用程序。我以這種方式遇到了場景,我必須創建兩個線程,第一個線程將被創建,第二個線程將被創建。 thread1必須發佈到thread2的處理程序中。但是由於系統速度很快,在thread2創建並處理程序被初始化之前,thread1開始將消息對象發佈到thread2。由於我面臨着意想不到的行爲。如何等待線程和處理程序初始化

請讓我知道如何等待線程2的線程開始並處理程序被初始化。我嘗試了輪詢機制,因爲它影響系統性能,因此此修復程序未被接受。

回答

1

只需使用類似的東西:

// @ Thread 1 
synchronized(someMonitor) { 
    someMonitor.wait(/* time? */); 
} 

// @ Thread 2 
synchronized(someMonitor) { 
    someMonitor.notify(); 
} 

所以線程1會等到線程2個通知。如果條件已經設置,我會在等待之前檢查。

+0

線程1不能保證在線程2之前啓動,所以在這種情況下你可以有無限的等待。更好的辦法就是儘可能地去除這些依賴性(對於多個生產商或多個消費者來說,這並沒有很好的擴展性) –

+0

您是否閱讀了我的最後一行?他應該檢查在等待之前是否已經設置了條件。 – MasterCassim

+0

對不起,專注於沒有等待條件的代碼 –

0

另一種方法是從線程1創建線程2,以便在線程1獲得發佈內容之前創建線程2用於輸入的隊列或任何內容。

RGDS, 馬丁

0

你需要重新考慮你的設計:它看起來像你正在處理的生產者/消費者模式,所以你可能需要使用一個(阻塞)隊列中的消息交換。從兩個線索創建它並在創建時將其傳遞給生產者和消費者。在這種情況下,哪個線程開始運行並不重要:如果生產者然後隊列開始被填充,如果消費者,那麼它將等待,直到生產者開始。

+0

其實我正在線程中創建隊列,所以在線程要運行之前(其中新的Handler()正在被創建),它創建的線程開始在thread.start()的下一行發佈,因此我面臨crash.o,這不是生產者和消費者的問題,我很抱歉如果我的描述一世不適合。 – Suman

0

您的第一個選擇是將消息隊列設置爲全局。

第二個是從thread1創建thread2。

三是有一個同步對象(Object.wait,notify,interrupt)。

儘管如此,我認爲和Mark一樣,問題在於你的設計,如果固有設計不合適,你不能爲這個問題提供一個很好的解決方案。