java - 线程“JavaFX 应用程序线程”中的异常 java.util.ConcurrentModificationException
问题描述
我在尝试在 JavaFx 中显示阶段时遇到此错误,已经尝试了多个可用的答案,但没有一个有效。
我的代码
private void redirectToLogin() {
try {
Parent root = null;
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/login.fxml"));
fxmlLoader.setResources(resourceBundle);
root = fxmlLoader.load();
Stage primaryStage = new Stage();
new Thread(() -> {
logger.info("Initializing tray icon");
App.TRAY_ICON = new TrayIcon();
App.TRAY_ICON.displayingTrayIcon(userService, downloadingService, schedulerService, primaryStage);
}).start();
primaryStage.setTitle(resourceBundle.getString("appTitle"));
primaryStage.getIcons().add(new javafx.scene.image.Image(this.getClass().getResource("/images/test.png").toString()));
Scene scene = new Scene(root, 800, 600);
scene.getStylesheets().add(getClass().getResource("/css/test.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setResizable(false);
System.out.println("Calling show");
primaryStage.show();
System.out.println("show called");
Platform.setImplicitExit(false);
} catch (Exception e) {
System.out.println("Exception in appinstall : "+e);
e.printStackTrace();
}
}
完整的错误堆栈:
Exception in thread "JavaFX Application Thread" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
at com.sun.javafx.font.PrismFontFactory.removeEmbeddedFont(PrismFontFactory.java:1554)
at com.sun.javafx.font.PrismFontFactory.loadEmbeddedFont(PrismFontFactory.java:1638)
at com.sun.javafx.font.PrismFontFactory.loadEmbeddedFont(PrismFontFactory.java:1529)
at com.sun.javafx.font.PrismFontLoader.loadFont(PrismFontLoader.java:99)
at javafx.scene.text.Font.loadFont(Font.java:400)
at com.sun.javafx.css.StyleManager.loadStylesheetUnPrivileged(StyleManager.java:1001)
at com.sun.javafx.css.StyleManager.loadStylesheet(StyleManager.java:798)
at com.sun.javafx.css.StyleManager.gatherParentStylesheets(StyleManager.java:1285)
at com.sun.javafx.css.StyleManager.findMatchingStyles(StyleManager.java:1400)
at javafx.scene.CssStyleHelper.createStyleHelper(CssStyleHelper.java:115)
at javafx.scene.Node.impl_processCSS(Node.java:8877)
at javafx.scene.Parent.impl_processCSS(Parent.java:1250)
at javafx.scene.control.Control.impl_processCSS(Control.java:872)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Parent.impl_processCSS(Parent.java:1281)
at javafx.scene.Node.processCSS(Node.java:8732)
at javafx.scene.Scene.doCSSPass(Scene.java:569)
at javafx.scene.Scene.access$3500(Scene.java:201)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2385)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:321)
at com.sun.javafx.tk.Toolkit$3.run(Toolkit.java:319)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:319)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:348)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:479)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:460)
at com.sun.javafx.tk.quantum.QuantumToolkit$13.run(QuantumToolkit.java:327)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
at java.lang.Thread.run(Thread.java:745)
所有路径/URI 都已经过双重检查,即图标、CSS 和 FXML 存在于相应的位置。
请帮忙
解决方案
您正在从不同的线程访问非并发哈希图。如果您需要从不同的线程访问相同的 hashmap 变量,您必须使用:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
也许来自 displayTrayIcon 功能?
推荐阅读
- azure - Azure 上的 SignalR:连接握手失败
- mysql - 如何对从 count() 派生的 sum() 值求和
- sql - REGEXP_LIKE 语法等价于访问 LIKE 查询
- kubernetes - 如何输出 kubectl 日志的详细信息
- r - 准备发布表格或如何以优雅的方式将均值和标准差结果放在一起
- integration-testing - 如何在赛普拉斯的 before 语句中从夹具文件创建变量?
- sqlite - 如何使用来自 github 的 brew 公式?
- php - Jquery 中 toast 的 Delay 属性在 PHP 构建的站点上不起作用
- python - 如何使用 pandas 在旅途中识别 csv 文件中的日期时间格式?
- asp.net-core - Asp.net core razor pages,身份,外部登录返回错误关联失败