Страницы

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

понедельник, 1 октября 2018 г.

Как запускать потоки или 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(); }


Ответ

Thread.join() заставляет текущий поток ждать завершения другого. При этом работа текущего потока будет остановлена и это равнозначно тому, чтобы просто запускать все задачи в одном потоке.
Если вам нужно N потоков запускать поочередно и не ждать их в основном потоке (из которого запускаете), посмотрите на java.util.concurrent.Executors.newSingleThreadExecutor()
Этот метод выдает вам ExecutorService, способный принимать (submit) любое количество задач (Runnable) и последовательно по одной их выполнять.
Вы также можете отдавать не Runnable, a Callable. Тогда sumbit возвращает Future, который может вам пригодиться, чтобы получить какие-то данные о скачанном файле.

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

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