如果在EDT线程外调用AWT代码,如何抛出异常?

时间:2012-06-07 20:47:16

标签: java swing exception awt event-dispatch-thread

我一直在网上搜索这个但是我还没有找到答案..也许你们中的某个人知道这一点。

我正在开发类似应用程序的swing桌面;因为我知道swing不是线程安全的(如果我在EDT之外的JComponent上调用一个方法,总是有机会用EDT本身获得死锁),我想有一个线程抛出的异常试图称之为那种方法..让我更好地解释一下:

假设我有2个线程:EDT和后台工作者(“BW”)。 例如,如果我在BW中呼叫JButton.setText()JButton.setIcon(),则有机会与EDT陷入僵局。现在我希望BW调用JButton.setText()并抛出异常来表示我做错了..

我看到VS2008上的C#默认执行此操作(我不知道是否有办法禁用此行为,但我认为检测错误代码非常有用)。有没有办法在java中实现类似的效果?

3 个答案:

答案 0 :(得分:3)

查看this article,其中介绍了检查Swing线程违规的RepaintManager。它不会捕获所有违规行为,但大多数违规行为。

您可以轻松调整该类以抛出Exception s只打印堆栈跟踪

答案 1 :(得分:1)

将您在代理中使用的每个秋千对象包裹起来,并使用反射生成。使该代理将线程与已知良好的EDT线程进行比较。如果不匹配则抛出RuntimeException。

答案 2 :(得分:1)

看看SwingUtilities.isEventDispatchThread。如果呼叫是在EDT内进行,则调用此方法将返回true,否则为false

它会完全按照您的意愿行事,问题是您可能需要在代码的多个位置进行此类调用;它的工作量更大。