当前位置: 首页 > 面试题库 >

在运行时在事件调度线程上摇摆验证代码

翟丰茂
2023-03-14
问题内容

是否有任何库可以检测代码以验证是否在事件调度线程上调用了在Swing组件上调用的方法?编写一些基本的代码来执行此操作可能不会很困难,但是我敢肯定,存在一些极端情况,其他人已经处理过了。我在运行时而不是在单元测试中寻找它。


问题答案:

该FEST框架有一个工具来检测摇摆使用关EDT。基本上是您安装的RepaintManager。该框架面向测试,但是可以在部署时使用RepaintManager。

  • 请参阅FEST-Swing的事件调度线程

或者,要检查诸如getter和setter之类的所有方法仅可在EDT上访问,可以使用AspectJ和加载时编织将SwingUtilities.isDisaptchThread()建议添加到swing组件(和JDK
Swing组件)的每个方法上。 )

@Aspect
public class EDTCheck {

    @Pointcut("call (* javax.swing..*+.*(..)) || " +
              "call (javax.swing..*+.new(..))")
    public void swingMethods() {}

    @Pointcut("call (* com.mystuff.swing..*+.*(..)) || " +
              "call (com.mystuff.swing..*+.new(..))")
    public void mySwingMethods() {}


    @Pointcut("call (* javax.swing..*+.add*Listener(..)) || " +
              "call (* javax.swing..*+.remove*Listener(..)) || " +
              "call (void javax.swing.JComponent+.setText(java.lang.String))")
    public void safeMethods() {}

    @Before("(swingMethods() || mySwingMethods()) && !safeMethods()")
    public void checkCallingThread(JoinPoint.StaticPart thisJoinPointStatic) {
        if(!SwingUtilities.isDispatchThread()) {
            System.out.println(
                    "Swing single thread rule violation: " 
                    + thisJoinPointStatic);
            Thread.dumpStack();
            // or you might throw an unchecked exception
        }
    }

}

(在文章中稍作修改-
添加了mySwingMethods切入点,并使用SwingUtiliites.isDispatchThread()。实际上,它与EventQueue.isDispatchThread()相同,但是抽象更干净。)

  • 请参阅使用AspectJ检测违反Swing单线程规则的情况


 类似资料:
  • 不久前,我写了一个缩放到鼠标摆动面板,处理高亮、平移、鼠标缩放、选择等。非常好。 我今天又去玩了几次,但都没用。我很困惑。我知道我有一个很好的例子——在某个地方。但在我的驾驶过程中,我的任何实验都不起作用。我开始努力让它再次发挥作用。 最终我发现了问题所在。它是JDK 11和我的新iMac的某种组合。我上一次做这个的时候,是在我的旧Mac上(我不记得在那里我可能用过JDK 11,也不记得有没有用过

  • 问题内容: 我有一个在EDT上运行的方法,在其中我想使它在新的(非EDT)线程上执行某些操作。我当前的代码如下: 问题答案: 您可以创建并启动一个新的Java线程,该线程从EDT线程中执行您的方法:

  • 问题内容: 这是一个普遍的Java问题,而不是Android的第一个问题! 我想从二级线程的上下文中了解如何在主线程上运行代码。例如: 这类事情-我意识到我的示例有点差,因为在Java中,您不需要进入主线程即可打印出某些内容,并且Swing也具有事件队列- 但在一般情况下,您可能需要在后台线程的上下文中,在主线程上运行Runnable。 编辑:为了进行比较-这是我在Objective-C中的做法:

  • 我们都知道Java会彻底优化我们的代码,我们都喜欢它。嗯,大多数时候。下面是一段让我头疼的代码: 在快速、慢速的单线程和多线程处理器之间,结果可能会有所不同。在我测试的计算机上(没有doSomething),输出如下: CompareThread的前几次迭代运行良好,然后Java进行了“优化”:testValue和currentValue总是相等的,并且不断地改变它们的值,尽管线程从未离开最内层的

  • 我们在代理后运行服务,以便: 被路由到公共地址 或者从另一个角度定义: 当nginx在上接收到请求时,它会去掉前缀,并将请求传递给路径上的service。 在设置任何东西之前(使用默认的SpringDoc配置),我可以正确地看到超文本传输协议上的昂首阔步的文档://service-post: 8080/swagger-ui.html。 设置主机上公共地址的路径。com,我正在使用: 然而,这似乎完

  • 问题内容: 我最近开始学习和探索Java中GUI编程的基础知识。 经过一段时间的编程,我只完成了后端工作或其他工作,因此,我最接近用户界面的是命令控制台(令人尴尬的是,我知道)。 我正在使用Swing,据我所知,通过扩展,我也正在使用AWT。 我的问题基于以下代码: 我已经研究了一段时间,因为我想完全理解这段奇怪的代码,并且多次遇到“事件分派线程”一词。如果我错了,请纠正我,但据我了解;它与使用多