Загрузка фалов в несколько потоков

244
27 февраля 2018, 05:15
public class LoaderBean {

    protected void download(List<File> files, String path, String nThreads) {
        for (File file : files) {
            new Downloader(file.getUrl(), path, file.getName()).startDownload();
            System.out.println(Thread.currentThread().getName());
            System.out.println(" ============================== ");
        }
    }
}

Есть такой код загрузки файлов. На входи приходит файл со списком файлов, путь, куда сохранять и количество потоков, для загрузки этих файлов. Я не совсем понимаю, как должна происходить загрузка через потоки.

protected void download(List<File> files, String path, String nThreads) {
        for (File file : files) {
            ExecutorService pool = Executors.newFixedThreadPool(Integer.parseInt(nThreads));
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    new Downloader(file.getUrl(), path, file.getName()).startDownload();
                    System.out.println(Thread.currentThread().getName());
                    System.out.println(" ============================== ");
                }
            });
        }
    }

Я пробовал такой код, но работал только один поток.

Answer 1

Вот этот код начал работать, однако, если убрать join, то перестаёт скачивать. В чём проблема может быть?

public class LoaderBean {

        protected void download(List<File> files, String path, String nThreads) throws InterruptedException {
            int countTreads = 0;
            int n = Integer.parseInt(nThreads);
            while(countTreads < files.size()) {
                Thread[] threads = new Thread[Integer.parseInt(nThreads)];
                for (int j = 0; j < n && j + countTreads != files.size(); ++j) {
                    threads[j] = new Thread(new MyThread(files.get(countTreads + j), path),
                            String.format("Thread %d", j));
                }
                if(countTreads + threads.length < files.size()) {
                    countTreads = countTreads + threads.length;
                }
                startThreads(threads);
            }
        }
        private static void startThreads(Thread[] threads) throws InterruptedException {
            for (Thread thread : threads) {
                if(thread == null){
                    System.exit(0);
                }
                thread.start();
                //thread.join();
            }
        }
    }
    class MyThread implements Runnable {
        private String path;
        private File file;
        MyThread(File file, String path){
            this.path = path;
            this.file = file;
        }
        public  void run() {
            new Downloader(file.getUrl(), path, file.getName()).startDownload();
            System.out.println(Thread.currentThread().getName());
            System.out.println(" ============================== ");
        }
    }
READ ALSO
Ошибка MediaPlayer.getCurrentPosition() при закрытии приложения

Ошибка MediaPlayer.getCurrentPosition() при закрытии приложения

Использую MediaPlayerВсе хорошо работает, но есть одно но: при закрытии приложении (нажатии кнопки "назад") - приложение закрывается, но выдает ошибку

233
WebDriver, всплывающая подсказка

WebDriver, всплывающая подсказка

При вводе в поле e-mail чего-то вроде "абв" - появляется всплывающая подсказка, которая исчезает при клике по нейКак можно ее отловить? В ресурсах...

194
Как получить локальный ip адрес машины в Java EE

Как получить локальный ip адрес машины в Java EE

Как получить локальный адрес машины в вебсервере Java EE? Внешний я могу получить, а вот именно локальныйТобишь человек подключается на сайт...

231
Проблема с автозаполнением в инпуте

Проблема с автозаполнением в инпуте

Здравствуйте друзьяИмеется инпут

264