Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как запускать потоки или Runnable строго поочередно в Java?


Как сделать так, чтобы потоки выполнялись поочередно, то есть следующий поток н
начинался раньше завершения предыдущего? 

Примечание: вызываю метод, который в отдельном потоке скачивает файлы из интернета.

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 в режим последовательного выполнения потоков.

Комментариев нет:

Отправить комментарий