2011-06-08 164 views
3

這是我的問題:我有一個應用程序在本地啓動模擬服務器。這個操作的輸出被重定向到一個日誌文件,我想在寫這個日誌文件的時候尋找一個特定的模式。阻塞線程 - Java

我已經實現了tail -f模擬(我必須在windows上工作),但是我無法讓兩個線程同時正常工作。

下面是一個示例(主):

server.launch(); 
patternFinder.start(); 

的patternFinder擴展Thread,這裏是它的run方法是什麼樣子:

public void run() { 
    while (true) { 
     //tail -f implementation 

     //I'll set a timeout when I can get it 
     //to work (the pattern is supposed to be found) 
    } 
} 

如果我把patternFinder.join()start()後,服務器將暫停執行並等待patternFinder返回(但他不會因爲日誌中沒有寫入任何內容)。但是子線程需要阻塞主線程,因爲我們不希望在找到模式之前執行任何指令(或者達到超時限制)。

任何想法?

(PS:第一篇文章,所以不要猶豫,告訴我,如果我做錯了什麼,或者如果您需要任何更多的細節)

+4

server.launch()是否創建一個新線程?我很困惑在概念上發生了什麼。什麼等待什麼從哪個線程? – 2011-06-08 16:20:32

+0

沒有在主線程中執行server.launch(),但它只是使用Runtime.exec()執行java命令,因此它不會等待服務器啓動。這就是爲什麼我需要一個模式查找器,以確保它正確啓動。 – talnicolas 2011-06-08 16:26:09

+0

那麼爲什麼patternFinder.join()不起作用?據推測,服務器已經在Runtime.exec調用之後運行。主線程阻塞不應該影響服務器。 – 2011-06-08 16:28:33

回答

0

就這樣,這個問題並沒有得到解答,我發現了某種解決方法,但從來沒有想過什麼是真正的問題。

所以顯然問題是我通過ProcessBuilder啓動我的服務器,看起來像這樣的命令java [arguments] [classpath] fileToLaunch。我嘗試了很多東西,但唯一有效的方法是將命令更改爲cmd /C start java [arguments] [classpath] fileToLaunch,以便在新窗口中啓動服務器,然後按預期工作。

如果有人能夠向我解釋這個祕密,隨時提供一個新的答案,仍然可以接受。

0

你應該用事件來協調線程。您可以等待主線程中的事件,並在發現事件時將其設置/重置到您的子線程中。

您可以使用手動或AutoResetEvents。不知道他們在Java中被稱爲,但我相信你可以找到。

+0

我不認爲這適合於Java。 – 2011-06-08 16:24:58