gpt4 book ai didi

java - 如何检查 FX 应用程序线程策略违规

转载 作者:行者123 更新时间:2023-12-04 17:56:34 27 4
gpt4 key购买 nike

我正在使用的一个应用程序大量使用 JavaFX,我注意到我们不断收到 this open jdk issue 中提到的形式的异常。 .该问题提到当您从 FX 应用程序线程创建节点时可能会发生异常。

我想找到从 FX 线程访问 FX 对象的任何地方,但是应用程序足够大,通过检查来做到这一点是不切实际的。我看到一个 similar question and answer for Swing ,但无法找到与 JavaFX 类似的任何东西。那里最常提到的 Swing 解决方案涉及自定义 RepaintManager ,这是一个 Swing 特定的接口(interface)。

所以 :如何(如果有的话)在不手动检查所有应用程序的 FX 代码的情况下找到代码在 FX 应用程序线程以外的线程上访问 JavaFX 对象的地方?

备注 :我完全意识到在 fx 线程之外与 fx 对象进行交互是一个坏主意。一旦发现违反政策的行为,我也充分意识到我可以使用 Platform.runLater(()->{/*fx code*/});在 fx 线程上执行操作。我的问题是关于如何找到违规行为。

最佳答案

也许并不理想,但一种解决方案是在 java.lang.ClassLoader.loadClass(String name,boolean resolve) 中放置一个条件断点。 ,条件为:

name.startsWith("javafx") && 
!Thread.currentThread().getName().equals("JavaFX Application Thread")

然后,每当从 javafx 包中加载新类时,您可以检查这些类是否正在加载到 FX 线程上。它当然不会捕获所有违规行为,但是当线程使用 FX 代码导致加载之前未使用的 FX 类时,它会通过暂停违规线程来通知您。

(如果可以将 !javafx.application.Platform.isFxApplicationThread() 添加到断点条件中,那就太好了,但在 Eclipse Luna 中,我无法让它工作。)

另请注意,并非每次您点击它都是实际违规 - 可以加载一个类,而无需实例化和/或与之交互的该类的实际对象。例如,如果从非 FX 线程调用以下构造函数,它可能会触发断点,尽管并不危险:
public class MyClass{
Label l = null; //Loading & instantiating MyClass loads
// the Label class, but doesn't necessarily
// violate the FX threading policy

public MyClass(){

}
}

然而,解决方案总比没有好(我已经发现了一个实际的违规行为)。

关于java - 如何检查 FX 应用程序线程策略违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com