Самый простой подход - использовать метод Thread.sleep, но вы не должны вызывать его в потоке приложения JavaFX. Если бы вы сделали это, вы бы заблокировали само приложение: не было бы отрисовки элементов управления и не отвечало бы на пользовательский ввод с помощью мыши или клавиатуры, пока не завершится ваш спящий вызов.
Это означает, что Thread.sleep нельзя вызвать из обработчика событий или прослушивателя. Чтобы решить эту проблему, вызовите Thread.sleep из совершенно новой темы.
Однако, хотя Thread.sleep нельзя вызывать в потоке приложения, обратное справедливо для методов JavaFX: они должны вызываться из потока приложения. Метод Platform.runLater позволяет сделать это:
Runnable task = () -> {
try {
for (int i = 0; i < chain.size(); i++) {
int index = i;
Platform.runLater(() -> {
a.appendText("Block: " + index + "\n");
a.appendText("Version: " + chain.get(index).getVersion()+ "\n");
a.appendText("TimeStamp: " + chain.get(index).getTimestamp()+ "\n");
a.appendText("PreviousHash: " + chain.get(index).getPreviousHash()+ "\n");
a.appendText("Hash: " + chain.get(index).getHash()+ "\n");
a.appendText("\n");
});
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
};
new Thread(task).start();
Причина int index = i;
заключается в том, что локальные переменные не могут быть прочитаны другими классами, например, анонимным Runnable, переданным Platform.runLater, если они не являются окончательными (или фактически окончательными).
Приведенный выше код предполагает, что коллекция chain
не изменяется. Если это может измениться во время чтения, вы должны сделать chain
потокобезопасную коллекцию (например, ConcurrentLinkedDeque или CopyOnWriteArrayList ) или самостоятельно реализовать безопасность потоков, что, вероятно, более сложнее, чем вы предполагали, для кода.