我有一个IntentService
,当用ACTION_FETCH_URLS
调用时,它应该在onHandleIntent()
期间获取固定数量的URL(小于20)。
现在我意识到我可能犯了一个错误,因为IntentService
在单个线程中运行,如果我在同一个线程中执行所有请求,那将会变得很慢,而且我认为如果我生成新线程将会继续离开onHandleIntent()
就会变得一团糟。
有没有专门的类可以让我定义要完成的任务,并调用类似doTasks()
的方法,该方法然后在不同的线程中并行运行,并且在所有线程完成后该方法结束?这样,我可以在onHandleIntent()
内等待。
编辑#1
我刚刚发现了CountDownLatch
,并且发现它非常适合我的需求。我可以在await()
上调用CountDownLatch
,它在onHandleIntent()
内阻塞,直到所有线程都完成工作为止。正是我想要的。
一种同步帮助,它允许一个或多个线程等待直到 在其他线程中执行的一组操作完成。
class Driver2 { // ...
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
Executor e = ...
for (int i = 0; i < N; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await(); // wait for all to finish
}
}
class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
WorkerRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
public void run() {
try {
doWork(i);
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() { ... }
}
来源:https://developer.android.com/reference/java/util/concurrent/CountDownLatch
这种方法是否有缺点?