если убрать 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();
}
}
}
Проблема в коде одна - зачем тебе делать это:
if(thread == null) {
System.exit(0);
}
Просто иди дальше по массиву, используя continue. join тут совсем тебе не надо, иначе зачем тебе каждый раз ждать, пока поток закончит свою работу, вся многопоточность потеряется. Других проблем в данном куске кода не видно.
Строкой кода thread.start()
Вы запускаете новый поток.
Строкой кода thread.join()
Вы даете указание главному потоку (который начинается со стартом public static void main(String[] args)
) ждать завершения потока thread
.
Следовательно, если вы уберете строку thread.join()
, то главный поток не будет ждать завершения и, если он больше ничего не делает, завершает свою работу, а вместе с ним и приложение (Ваши потоки могут просто не успеть выполнить какую-то задачу).
Виртуальный выделенный сервер (VDS) становится отличным выбором
Можно ли сделать бесконечное чтение скопированного текста из clipboard'a?
Как можно сделать такие полосы (штриховку) в TreeView? Перегуглил как мог, нигде и намёка нет на подобную штуку