Java 如何检测Swing线程策略冲突
我正在寻找一种自动方法来检测代码中违反Swing单线程策略的情况。我正在寻找一些类似于swing应用程序运行时放入VM的AOP代码,并让它记录在EDT之外修改swing组件的任何地方 我不是AOP爱好者,但我会想象在每个java.swing.*类周围创建一个AOP代理Java 如何检测Swing线程策略冲突,java,debugging,swing,multithreading,Java,Debugging,Swing,Multithreading,我正在寻找一种自动方法来检测代码中违反Swing单线程策略的情况。我正在寻找一些类似于swing应用程序运行时放入VM的AOP代码,并让它记录在EDT之外修改swing组件的任何地方 我不是AOP爱好者,但我会想象在每个java.swing.*类周围创建一个AOP代理 AOP_before(Method m, Object args[]) { if (!isEventDispatchThread(Thread.currentThread()) { logStack(new RuntimeE
AOP_before(Method m, Object args[]) {
if (!isEventDispatchThread(Thread.currentThread()) {
logStack(new RuntimeException("violation!"));
}
invoke(m, args);
}
有人知道这样做的项目或实用程序吗?我没有使用过这一个,但这应该可以做到 它确实需要添加以下内容:
RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
但是,我发现了一篇4年前的博客文章,其中描述了EDT违规行为,但是如果你找到一篇能够检测到最多EDT违规行为的文章,我会非常感兴趣。RepaitManager在检测所有违规行为时似乎不是防弹的。为了子孙后代,这里是ToBubeer发现的CheckThreadViolationRepaitManager的简化版本
RepaintManager.setCurrentManager(new RepaintManager() {
public synchronized void addInvalidComponent( JComponent component ) {
check( component );
super.addInvalidComponent( component );
}
public void addDirtyRegion( JComponent component, int x, int y, int w, int h ) {
check( component );
super.addDirtyRegion( component, x, y, w, h );
}
private void check( JComponent c ) {
if( !SwingUtilities.isEventDispatchThread() && c.isShowing() ) {
new Throwable("EDT required!").printStackTrace();
}
}
});
只要在main方法中调用它,只要在非EDT线程上更改组件,就会记录stacktraces。我以前回答过类似的问题,并提供了AOP代码。关于如何找到它,有什么建议吗?我已经尝试过显而易见的搜索,谷歌,等等。我建议在应该在EDT上运行的代码和不应该在EDT上运行的代码之间保持干净的分隔。尽量避免让类将应在EDT上运行的代码与不应在EDT上运行的代码组合在一起,即使这看起来像是一个快捷方式。@mdma,只需单击您的姓名,您就可以看到您回答的问题列表。是否知道RepaitManager无法检测到哪些情况?这些解决方案看起来非常好,但更难快速实施。你还有链接吗?你提供的那个已经不起作用了。这个效果很好。我已经发现了一些违规行为。链接的代码基于另一个人以前的一些工作。代码包括一个指向他不存在的博客帖子的链接;我在Wayback机器上找到了一本,发现它是一本有趣的读物。这里有一个链接,指向基于RepaitManager的解决方案上原始作者博客条目的永久[?]存档版本。