Как сделать так, чтобы потоки выполнялись поочередно, то есть следующий поток н
начинался раньше завершения предыдущего?
Примечание: вызываю метод, который в отдельном потоке скачивает файлы из интернета.
for(int i = 0; i < l; i++) {
downloadFile(metadata.getDriveId().encodeToString(), metadata.getTitle());
}
public void downloadFile(String id, final String name) {
new Thread() {
@Override
public void run() {
// скачивание
}
}.start();
}
Ответы
Ответ 1
Thread.join() заставляет текущий поток ждать завершения другого. При этом работ
текущего потока будет остановлена и это равнозначно тому, чтобы просто запускать все задачи в одном потоке.
Если вам нужно N потоков запускать поочередно и не ждать их в основном потоке (и
которого запускаете), посмотрите на java.util.concurrent.Executors.newSingleThreadExecutor()
Этот метод выдает вам ExecutorService, способный принимать (submit) любое количество задач (Runnable) и последовательно по одной их выполнять.
Вы также можете отдавать не Runnable, a Callable. Тогда sumbit возвращает Future, который может вам пригодиться, чтобы получить какие-то данные о скачанном файле.
Ответ 2
Есть такой метод называется Thread.join() - позволяет дождаться завершения потока или запустить поток после некоторого ожидания.
За примерами втыкаем сюда
Ответ 3
Вот, что говорит гугл в описании класса AsyncTask:
Order of execution.
Starting with HONEYCOMB, tasks are executed on a single thread to avoid commo
application errors caused by parallel execution.
Начиная с API 11 запуск потока через AsyncTask.execute() ставит все следующие поток
после первого в очередь и они дожидаются окончания выполнения предыдущих , то есть задачи выполняются последовательно , а не параллельно.
Для верности можно использовать параметр SERIAL_EXECUTOR, в вызове экзекутора
asyncTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
который принудительно переводит AsyncTask в режим последовательного выполнения потоков.
Комментариев нет:
Отправить комментарий