У меня есть IntentService
, что при вызове с ACTION_FETCH_URLS
он должен пойти и извлечь фиксированное количество URL (меньше 20) в течение onHandleIntent()
.
Теперь я понимаю, что, возможно, допустил ошибку, потому что 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
Есть ли недостатки этого подхода?