Android线程 - 延迟重复几次线程组

时间:2011-04-27 23:26:10

标签: java android multithreading queue

我将实现一个从Android设备收集数据的应用程序。

这就是我现在所拥有的:

  • 使用按钮运行
  • 的主要活动
  • 按钮启动记录器
  • 记录器有4个资源 Runnable
    • GpsResource
    • ImageResource
    • AudioResource
    • GyroscopeResource
  • Recorder 中有一个 for 循环(例如i < 3),它运行一些带有一些延迟的线程(i * 5000

我应该如何创建所有线程,以便所有线程同时启动(i=0),然后在5秒后重新开始(i=1)并在接下来的5秒后再次启动(i=2) ?

接下来的事情:

每个资源都使用getData()方法返回一些数据 - 简化它 - 带有随机字符的字符串。如何在 Recorder 中通知队列中的所有线程都已完成并从资源中收集所有数据?

最后一件事:

我必须能够在创建所有队列后停止执行所有线程。例如:

我们有第7个第二个队列,现在正在运行,用户点击按钮停止。运行线程的队列即将完成,但下一个队列将无法启动,只需 Recodred 就会忘记它们。

我尽量写得尽可能简单,我相信你们都了解我。

感谢您的任何建议!

1 个答案:

答案 0 :(得分: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秒安排一次相同的操作。