Я пытаюсь обновить индикатор выполнения в Java FX. Моя первая проблема заключалась в том, что окно «не отвечает» вместо фактического обновления. Он просто застыл, а затем, после того как задачи были выполнены, индикатор выполнения заполнился. Поэтому я обнаружил, что мне нужно использовать многопоточность, и реализовал это следующим образом.
overallList.clear();
progressbar.setprogress(0);
for(Object obj : list) {
class ThreadProgress implements Runnable { // inner class
public void run() {
thisList = scrape(obj);
overallList.add(thisList);
progressbar.setProgress(progressbar.getProgress() + (double)1/size);
}
}
Thread current = new Thread(new ThreadProgress());
current.start();
}
textAreaConsole.setText("Total number of things:" + overallList.size());
Но теперь проблема заключается в том, что в последней строке выводится «Общее количество вещей: 0», поскольку потоки фактически не завершают выполнение до того, как машина запускает последнюю строку. Затем я обнаружил несколько способов исправить это, в частности, используя join () или ExecutorService. Я реализовал join () следующим образом.
overallList.clear();
progressbar.setprogress(0);
List<Thread> threads = new ArrayList<Thread>();
for(Object obj : list) {
class ThreadProgress implements Runnable { // inner class
public void run() {
thisList = scrape(obj);
overallList.add(thisList);
progressbar.setProgress(progressbar.getProgress() + (double)1/size);
}
}
Thread current = new Thread(new ThreadProgress());
current.start();
threads.add(current);
}
for(Thread thread : threads) thread.join(); // with a try-catch loop
textAreaConsole.setText("Total number of things:" + overallList.size());
Но это возвращает меня к первоначальной проблеме, окно снова говорит "не отвечает". То же самое произошло с ExecutorService. Я понятия не имею, что теперь делать.