2013-07-02 85 views
2

在Java線程中,您可以在列表中創建一些線程,啓動它們,然後有一個主線程join一個,然後等待所有進程完成,然後再繼續。在Android/Java中等待多個回調?

在其他模型中,我不確定你會如何做到這一點。以RootTools 3.0 Command類爲例。您創建了一個Command,它有三種方法,分別爲commandOutput,commandFinished,commandTerminated,儘管您可以使用回調在進程結束時執行某些操作,但我不知道如何等待多個進程(例如,列出幾個目錄並總結文件大小)。

我相信Android Asynctask會有類似的問題 - 您可以輕鬆地進行回調,但無法等待幾個任務。除非我錯過了什麼?

回答

2

你可以調用wait()您正在執行命令

雖然在此之前。您應該關閉處理程序以調用等待的命令,可以通過將RootTools.handlerEnabled設置爲false或在每個單獨的命令中使用構造函數並傳入false來禁用該命令的處理程序來爲每個命令執行此操作。

這很重要,因爲如果使用了處理程序,它將嘗試調用您調用wait()的線程上的回調方法,並導致死鎖。

當您關閉該命令的處理程序並調用wait()時,該命令將在完成時調用notifyAll(),以便您的線程恢復。

這樣做的負面影響是回調方法將不再在您正在處理的線程中完成,因此您將無法從這些回調方法執行任何UI工作,除非您實施處理程序或其他方法可接受的解決方案來處理這個

+0

呵呵,我發現這個線程正在搜索「方法回調等待」。你猜怎麼着。我和RootTools有同樣的問題 - 一個僵局。 handlerEnabled = false解決了這個問題。如果不是你在這裏回答我們會卡住:) –

0

使用CountDownLatch,我會在這裏複製了更好的語法高亮(其使用例如:

class Driver { // ... 
    void main() throws InterruptedException { 
    CountDownLatch startSignal = new CountDownLatch(1); 
    CountDownLatch doneSignal = new CountDownLatch(N); 

    for (int i = 0; i < N; ++i) // create and start threads 
     new Thread(new Worker(startSignal, doneSignal)).start(); 

    doSomethingElse();   // don't let run yet 
    startSignal.countDown();  // let all threads proceed 
    doSomethingElse(); 
    doneSignal.await();   // wait for all to finish 
    } 
} 

class Worker implements Runnable { 
    private final CountDownLatch startSignal; 
    private final CountDownLatch doneSignal; 
    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { 
    this.startSignal = startSignal; 
    this.doneSignal = doneSignal; 
    } 
    public void run() { 
    try { 
     startSignal.await(); 
     doWork(); 
     doneSignal.countDown(); 
    } catch (InterruptedException ex) {} // return; 
    } 

    void doWork() { ... } 
} 
+0

這與加入線程不一樣嗎?我需要在回調上做到這一點。 – NoBugs

+0

嗯......它在某些方面有所不同,可以在'doneSignal.countDown()'之後的Worker的'run()'方法中使用'doneSignal.await()'以獲得更多類似回調的等待方法,但我不確定我是否瞭解您的原始問題。你能改說嗎? – Miguel

0

This SO question可能是一個好的開始。

這個想法很簡單,給執行器提供一大堆任務,它們負責並行運行它們(即使有一些返回對象,如果需要)並等待任務完成。