我将实现一个从Android设备收集数据的应用程序。
这就是我现在所拥有的:
i < 3
),它运行一些带有一些延迟的线程(i * 5000
)我应该如何创建所有线程,以便所有线程同时启动(i=0
),然后在5秒后重新开始(i=1
)并在接下来的5秒后再次启动(i=2
) ?
接下来的事情:
每个资源都使用getData()
方法返回一些数据 - 简化它 - 带有随机字符的字符串。如何在 Recorder 中通知队列中的所有线程都已完成并从资源中收集所有数据?
最后一件事:
我必须能够在创建所有队列后停止执行所有线程。例如:
我们有第7个第二个队列,现在正在运行,用户点击按钮停止。运行线程的队列即将完成,但下一个队列将无法启动,只需 Recodred 就会忘记它们。
我尽量写得尽可能简单,我相信你们都了解我。
感谢您的任何建议!
答案 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秒安排一次相同的操作。