3

Существует ArrayList, который в себе содержит ссылки на файлы для скачивания. Существует метод downloadFile который может скачать эти файлы.

Кусок кода:

 for (String i : arrayList) {
     downloadFile(i);
 }

позволяет скачать все ссылки по очереди

Подскажите пожалуйста, каким образом можно запустить скачку в несколько потоков?

  • 3
    Запускайте в цикле потоки, сделайте после цикла join, делов-то! – VladD Mar 15 '14 at 16:24
  • @VladD в том то и проблема, я не совсем понимаю как правильно написать сам поток, как их запустить я понимаю – elite_kr Mar 15 '14 at 16:30

4 Answers4

7

Эх, всё вам разжевать надо. А вы документацию читали?

List<Thread> threads = new ArrayList<Thread>();
for (String s : arrayList) {
    final String finalS = s; // у Java замыкания слабоваты, нужна копия
    Thread thread = new Thread() {
        public void run() {
            downloadFile(finalS);
        }
    };
    threads.add(thread);
    thread.start();
}

for (Thread t : threads) { t.join(); }

Проверка: http://ideone.com/4L6nNM

VladD
  • 206,799
  • Примерно это вариант я знал как сделать но если я правильно понимаю, то будет создано такое количество потоков, сколько элементов у меня в ArrayList

    а если мне нужно создать например только 10 потоков? а элементов в ArrayList у меня 50 и зациклить выполнение потоков пока они не выберут ArrayList

    – elite_kr Mar 15 '14 at 17:23
  • @elite_kr: Тогда вам нужен вариант producer-consumer queue. – VladD Mar 15 '14 at 17:55
  • Обновленная ссылка: http://ru.stackoverflow.com/questions/428327/%d0%98%d0%bc%d0%bf%d0%bb%d0%b5%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d1%8f-producer-consumer-pattern – andreycha Aug 05 '16 at 13:52
  • Воспользуйтесь исполнителем с фиксированным пулом потоков. Executors.newFixedThreadPool(10); и скармливаете в него Runnable. (см. https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html и https://examples.javacodegeeks.com/core-java/util/concurrent/executorservice/java-executorservice-example-tutorial/) – DimXenon Aug 05 '16 at 13:57
6

Как вариант, вот такое решение:

int threadCount = 10;
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);

for (String s : arrayList)
    executorService.submit(() -> downloadFile(s));

executorService.shutdown();
while (executorService.isTerminated() 
           && !Thread.currentThread().isInterrupted()) {}
Artem
  • 14,967
5

arrayList.parallelStream().forEach(f -> f.downloadFile(f));

выполняет в нескольких потоках и качает параллельно

2

попробуйте библиотеку java.util.concurrent, с помощью нее можно организовать пул потоков и там некоторые вещи неплохо оптимизированы.больше о ее возможностях можно узнать тут

Iga
  • 1,891