2012-06-05 22 views
1

我想在新線程上分派任務,並且我希望此任務在其各個執行階段通知父線程。如下所示:在可以與父線程通信的新線程上分派任務

void unzip(Path source, Path destination, ObserverThread observer) { 
    int n = compute number of entries; 
    observer.notify("n: " + n); 
    while (there are more entries) { 
    observer.notify("Unzipping " + name of entry); 
    unzip the entry; 
    } 
    observer.notify("done"); 
} 

什麼是這個用例的標準庫唯一的解決方案? (我想要外部依賴性。)

回答

1

如果你在Swing中使用它,那麼你應該使用SwingWorker(Java的一部分)。在後臺工作時,how to publish interim results上有一個示例。

如果你不使用Swing,那麼標準java自帶Executors類。您可以創建一個線程ExecutorService並將您的Runnable提交給它。它沒有提供發佈結果的方式,但仍可以像在示例中顯示的那樣手動執行回調。

+0

發佈臨時結果的鏈接很有用。謝謝! – missingfaktor

+0

雖然這並不回答原來的問題。 SwingWorker的'publish'和'process'是'protected'。這個和它的架構迫使人們把所有的邏輯放在上述'SwingWorker'裏面。 – missingfaktor

+0

邏輯進入你自己的類,但它確實需要擴展'SwingWorker'。另外,您可以將'addPropertyChangeListener'添加到SwingWorker,並且在進行進度時可以通知監聽器,或者您可以啓動自己的事件。 – Andrejs

1

一種可能的方法是使用blocking queue of sorts。父將定期pollpeek在以接收新郵件隊列(穿插不管它無論如何,比方說,監聽事件等)

的「孩子」線程只會add其消息隊列,假設父母及時刪除它們。

我在這裏假設父,子線程必須並行運行,也就是說,直到新的消息到達子進程時父線程才阻塞是不可行的:在子進程中有一個獨立的子線程無論如何。

使用阻塞隊列可以確保,即使子產生的消息比父代消耗的消息快,內存使用也會保持有限,並且孩子將不得不在某個時刻等待,直到父母終於管理爲止再次在隊列中騰出空間。

另一種方法是開始丟棄消息,當父母不能足夠快地消耗它們時。

+0

這對我來說太複雜了,我是Java併發抽象的新手。儘管謝謝你的回答! – missingfaktor