join() запуск потоков

175
01 марта 2018, 12:49

если убрать join() программа и потоки перестают работать. Как можно исправить?

public class LoaderBean {

            protected void download(List<File> files, String path, String nThreads) throws InterruptedException {
                int countTreads = 0;
                int n = Integer.parseInt(nThreads);
                int nLastThreadsNumber = files.size() % n; 
                Thread[] threads;                        
                while(countTreads < files.size()) {
                    if(countTreads + nLastThreadsNumber == files.size()) {
            threads = new Thread[nLastThreadsNumber];
        }
        else {
            threads = new Thread[n];
        } 

Эта штука выше для того, если количество потоков не кратно длине файла - 27%5 = 2, тогда на последнем этапе создастся массив поток размера 2, а не 5, как было до этого. Каким-то непонятным образом, если на входе написать например потоков штук 100, а файл размера 25, то всё норм скачивается. Может кто объяснить почему не кидает nullpointer?

                    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();
                }
            }
        }
Answer 1

Проблема в коде одна - зачем тебе делать это:

if(thread == null) {
    System.exit(0);
}

Просто иди дальше по массиву, используя continue. join тут совсем тебе не надо, иначе зачем тебе каждый раз ждать, пока поток закончит свою работу, вся многопоточность потеряется. Других проблем в данном куске кода не видно.

Answer 2

Строкой кода thread.start() Вы запускаете новый поток. Строкой кода thread.join() Вы даете указание главному потоку (который начинается со стартом public static void main(String[] args)) ждать завершения потока thread.

Следовательно, если вы уберете строку thread.join(), то главный поток не будет ждать завершения и, если он больше ничего не делает, завершает свою работу, а вместе с ним и приложение (Ваши потоки могут просто не успеть выполнить какую-то задачу).

READ ALSO
Бесконечное чтение из clipboard

Бесконечное чтение из clipboard

Можно ли сделать бесконечное чтение скопированного текста из clipboard'a?

173
JavaFx: TreeView

JavaFx: TreeView

Как можно сделать такие полосы (штриховку) в TreeView? Перегуглил как мог, нигде и намёка нет на подобную штуку

175
java Перегрузка методов и generic

java Перегрузка методов и generic

У меня есть следующий код:

144
Обработка NaN и Infinite при вычислении в Java

Обработка NaN и Infinite при вычислении в Java

Есть метод для возведения числа в степень

157