new Thread(() -> {
Platform.runLater(() -> {
while(true) {
if(!files.isEmpty()) {
fileContainer.getChildren().add(files.poll());
}
}
});
}).start();
это утверждение действительно делает следующее:
Runnable action1 = () -> {
while(true) {
if(!files.isEmpty()) {
fileContainer.getChildren().add(files.poll());
}
};
Runnable action2 = () -> {
Platform.runLater(action1);
};
new Thread(action2).start();
Итак, action2 выполняется очень быстро, нет смысла запускать его в отдельном потоке. Однако action2 имеет бесконечный цикл и работает вечно и работает в потоке GUI, фактически блокируя этот поток и не позволяя ему перематывать экран.
Возможно, вы слышали, что вы не можете занимать поток GUI в течение длительного времени. То есть вы должны выполнить цикл вне потока GUI, примерно так:
Runnable action1 = () -> {
while(true) {
Platform.runLater(
fileContainer.getChildren().add(files.take());
});
};
new Thread(action1).start();
Теперь мы видим, что этот поток делает очень мало - отбирает области файлов из очереди, оборачивает их простым способом и помещает во входную очередь потока GUI. Таким образом, это может быть устранено, и вся работа может быть выполнена в потоке загрузчика: вместо files.add(new FilePane(...))
do
Platform.runLater(
fileContainer.getChildren().add(new FilePane(...));
});