JavaFx TextArea 在循环内调用 appendText() 时冻结
JavaFx TextArea freezes when calling appendText() inside a loop
所以我尝试从循环中非常频繁地更新 TextArea
// This code makes the UI freez and the textArea don't get updated
for(int i = 0; i < 10000; i++){
staticTextArea.appendText("dada \n");
}
我还尝试实现一个 BlockingQueue 来创建更新 TextArea 的任务,这解决了 UI 的冻结问题,但 TextArea 在数百个循环后停止更新,但同时 System.out.print("dada \n");正常工作。
private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);
private static Thread mainWorker;
private static void updateTextArea() {
for(int i = 0 ; i < 10000; i++) {
addJob(() -> {
staticTextArea.appendText("dada \n");
System.out.print("dada \n");
});
}
}
private static void addJob(Runnable t) {
if (mainWorker == null) {
mainWorker = new Thread(() -> {
while (true) {
try {
queue.take().run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
mainWorker.start();
}
queue.add(t);
}
发生这种情况是因为您阻塞了 UI 线程。
JavaFX 提供 Platform
class,它公开了 runLater
方法。
该方法可用于 JavaFX 应用程序线程(不同于 UI 线程)上的 运行 long-运行ning 任务。
final Runnable appendTextRunnable =
() -> {
for (int i = 0; i < 10000; i++) {
staticTextArea.appendText("dada \n");
}
};
Platform.runLater(appendTextRunnable);
所以我尝试从循环中非常频繁地更新 TextArea
// This code makes the UI freez and the textArea don't get updated
for(int i = 0; i < 10000; i++){
staticTextArea.appendText("dada \n");
}
我还尝试实现一个 BlockingQueue 来创建更新 TextArea 的任务,这解决了 UI 的冻结问题,但 TextArea 在数百个循环后停止更新,但同时 System.out.print("dada \n");正常工作。
private static final BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(100);
private static Thread mainWorker;
private static void updateTextArea() {
for(int i = 0 ; i < 10000; i++) {
addJob(() -> {
staticTextArea.appendText("dada \n");
System.out.print("dada \n");
});
}
}
private static void addJob(Runnable t) {
if (mainWorker == null) {
mainWorker = new Thread(() -> {
while (true) {
try {
queue.take().run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
mainWorker.start();
}
queue.add(t);
}
发生这种情况是因为您阻塞了 UI 线程。
JavaFX 提供 Platform
class,它公开了 runLater
方法。
该方法可用于 JavaFX 应用程序线程(不同于 UI 线程)上的 运行 long-运行ning 任务。
final Runnable appendTextRunnable =
() -> {
for (int i = 0; i < 10000; i++) {
staticTextArea.appendText("dada \n");
}
};
Platform.runLater(appendTextRunnable);