2011-04-27 63 views
0

我要實現一個從Android設備收集數據的應用程序。Android線程 - 延遲幾次重複線程組

這是我現在所擁有的:

  • 一個按鈕運行主要業務
  • 按鈕啓動記錄
  • 記錄有4個資源的Runnable
    • GpsResource
    • ImageResource
    • AudioResource
    • GyroscopeResource
  • 錄像機存在用於環路(例如i < 3)運行的線程組與一些延遲的i * 5000

我應該如何創建這些線程,讓它們全部都是wi會同時開始(i=0),然後5秒後再次開始(i=1),再過5秒後(i=2)?

接下來的事情:

每個資源返回一些數據與getData()方法 - 用隨機字符字符串 - 簡化它。如何通知記錄器隊列中的所有線程都已完成並從資源中收集所有數據?

的最後一件事:

我必須創建所有隊列停止執行所有線程後能。例如:

我們有一個第7秒,第2個隊列正在運行,用戶單擊一個按鈕停止。正在運行線程的隊列即將完成,但下一個隊列將不會啓動,只需要Recodred必須將它們忘掉。

我試着寫得儘可能簡單,我相信你們明白我的意思。

感謝您的任何建議!

回答

0

這裏有一個方法來解決這個問題的至少一部分:

要啓動資源整合在一起,並等待它們完成:

乘坐CompletionService

Executor e = Executors.newFixedThreadPool(4); 
CompletionService<String> service = new ExecutorCompletionService<String>(e); 
CountDownLatch startLatch = new CountDownLatch(1); 
for (int i=0; i<numberOfResources; i++) { 
    Resource r = createResource(startLatch, i); 
    service.submit(r); 
} 
startLatch.countDown(); 

Resource應看起來像這樣:

class Resource implements Callable<String> { 
    private final CountDownLatch latch; 
    public Resource(CountDownLatch latch) { this.latch = latch; } 
    public String call() throws Exception { 
     latch.await(); 
     return getData(); 
    } 
} 

不會從完成服務取回數據:

for (int i=0; i<numberOfResources; i++) { 
    String data = service.take().get(); 
    // do something with data 
} 

請注意,這是更多的僞代碼,沒有實際測試過:)

而且還存在未解決的問題你會怎麼做,如果一些資源需要超過5秒才能執行。另一個是每5秒安排一次相同的操作。