Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检测Swing线程策略冲突_Java_Debugging_Swing_Multithreading - Fatal编程技术网

Java 如何检测Swing线程策略冲突

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

我正在寻找一种自动方法来检测代码中违反Swing单线程策略的情况。我正在寻找一些类似于swing应用程序运行时放入VM的AOP代码,并让它记录在EDT之外修改swing组件的任何地方

我不是AOP爱好者,但我会想象在每个java.swing.*类周围创建一个AOP代理

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的解决方案上原始作者博客条目的永久[?]存档版本。