2012-07-07 855 views
2
ExecutorService exec = Executors.newFixedThreadPool(8); 
List<Future<Object>> results = new ArrayList<Future<Object>>(); 

// submit tasks 
for(int i = 0; i < 8; i++) { 
    results.add(exec.submit(new ThreadTask())); 
} 

... 

// stop the pool from accepting new tasks 
exec.shutdown(); 

// wait for results 
for(Future<Object> result: results) { 
    Object obj = result.get(); 
} 


class ThreadTask implements Callable<Object> { 

    public Object call() { 
     // execute download 
     ... 
     return result; 
    } 
} 

上面的代碼沒有顯示出我期望的結果。更詳細地說,我正在爲android做一個下載管理器。這些線程用於分段下載文件。因爲,每個細分可能需要不同的時間來下載,我認爲這是問題所在。Android:等待線程完成執行方法

然後我嘗試在方法內使用一個簡單的數字返回。然後線程開始給出預期的結果。

因此,作爲一個解決方案,我想實現一個方法來等待所有的線程執行完的。在上面的代碼中,我該如何等待所有線程完成他們的工作?我想我必須使用wait()方法,但我不知道該怎麼做。希望你能幫助解決這個問題。

謝謝你的時間。

+2

'上面的代碼不告訴我我expected.'什麼是預期的結果,什麼是你看到的結果嗎? – 2012-07-07 12:58:42

+0

什麼是不工作的代碼?它不會終止嗎? – Tudor 2012-07-07 13:15:05

+0

@JohnVint:edited :) – don 2012-07-07 14:00:07

回答

0

如果您需要一組線程,以滿足某些點 - 在嘗試使用「屏障」的格局。

的Java SE擁有它的實現:java.util.concurrent.CyclicBarrier中

從文檔:一個同步輔助類,它允許一組線程都等待對方達成一個共同的障礙點。 CyclicBarriers在涉及固定大小的線程的程序中很有用,它必須偶爾等待對方。該屏障稱爲循環,因爲它可以在等待線程釋放之後重新使用。

一個的CyclicBarrier支持每屏障點運行一次,可選的Runnable命令,在黨內的最後一個線程到達之後,但任何線程都被釋放之前。這種屏障行爲對於在任何一方繼續之前更新共享狀態都很有用。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html