java.lang.IllegalStateException: Not on FX application thread

编程教程 > Java > JAVA UI (2090) 2024-11-26 14:39:04

问题描述

最近写JavaFX程序遇到了下面的错误:
Exception in thread "pool-2-thread-1" java.lang.IllegalStateException: Not on FX application thread; currentThread = pool-2-thread-1
	at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:291)
	at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:424)
	at javafx.stage.Stage.<init>(Stage.java:254)
	at javafx.stage.Stage.<init>(Stage.java:240)
	at javafx.scene.control.HeavyweightDialog$1.<init>(HeavyweightDialog.java:52)
	at javafx.scene.control.HeavyweightDialog.<init>(HeavyweightDialog.java:52)
	at javafx.scene.control.Dialog.<init>(Dialog.java:267)
	at javafx.scene.control.Alert.<init>(Alert.java:245)
	at javafx.scene.control.Alert.<init>(Alert.java:220)
	at net.ifok.bilibili.Root.alert(Root.java:48)
	at net.ifok.bilibili.controller.AppController.lambda$download$3(AppController.java:129)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

大概意思就是在非FX 应用线程中创建使用了FX的组件。

问题来源

我查找了下原因,是因为我的一个任务处理在自创的一个线程池的线程执行,然后在执行任务的时候我创建了一个Alert提示框,导致的这个错误。

解决办法

我在解决之前查找了资料,发现有朋友说通过
Platform.runLater(()->{


});
通过把任务丢在这个ruan里面来解决,原因是Platform的run是FX线程来运行,所以没问题。那么问题来了,如果是线程中任务不长且不用查看任务进度反馈则可以使用,如果任务长+需要界面展示任务进度,则该办法不可行,会让程序假死。

我这里只是一个Alert,我的办法就是不把整个任务放在Platform,只把需要操作界面组件的时候添加Platform,例如:
我的线程池
执行任务开始--->

//弹出消息
Platform.runLater(()->{
   Root.alert(Alert.AlertType.INFORMATION,"任务完成","请前往["+pathToSave.getText()+"]查看");
});

执行结束----->

评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
问题描述最近写JavaFX程序遇到了下面的错误:Exception in thread "pool-2-thread-1" java.lang.IllegalStateException: No...
java多线程编程_java多线程安全_java多线程实现安全锁CAS机制,CAS在java多线程中相当于数据库的乐观锁,synchronized相当于数据库的乐观锁。
Java基础多线程之主线程等待子线程结束,Java基础编程之多线程入门学习篇。主要讲解几种方法来实现Java多线程中主线程等待子线程结束的最快方式。
问题描述JavaFX maven项目在idea中启动报错:Exception in thread "WindowsNativeRunloopThread" java.lang.NoSuchMet...
线程安全是像Java这样的语言/平台中的类的重要质量,我们经常在线程之间共享对象。由于缺乏线程安全性而导致的问题非常难以调试,因为它们零星且几乎不可能有意再现。你如何测试你的对象以确保它们是线程...
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
最近在学习JavaFX,发现资料很少,连基本的图片读取都很多错误版本
1.使用idea创建JavaFX项目idea创建JavaFX项目创建后运行尝试:运行结果 可以看到目前是能正常运行 Hello Word项目的,这个时候还没有maven支持
在第11次发布之后,人们对JavaFX与JDK脱钩产生了各种各样的感受。我们中的许多人认为现在是时候告别JavaFX并转而采用另一种GUI技术,而其他一些人则对这种情况感到高兴。
Java多线程生命周期
Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。
ThreadPoolExecutor 实现的拒绝策略有以下几种AbortPolicyDiscardPolicyDiscardOldestPolicyCaller
线程池创建 /** * 队列用线程 * @return */ @Bean(name = "queuePool") public Thread...
本文将讲述什么是自旋锁?自旋锁的使用场景,什么情况适合使用自旋锁?Java 怎么使用自旋锁?