我一直在网上搜索这个但是我还没有找到答案..也许你们中的某个人知道这一点。
我正在开发类似应用程序的swing桌面;因为我知道swing不是线程安全的(如果我在EDT之外的JComponent上调用一个方法,总是有机会用EDT本身获得死锁),我想有一个线程抛出的异常试图称之为那种方法..让我更好地解释一下:
假设我有2个线程:EDT和后台工作者(“BW”)。
例如,如果我在BW中呼叫JButton.setText()
或JButton.setIcon()
,则有机会与EDT陷入僵局。现在我希望BW调用JButton.setText()
并抛出异常来表示我做错了..
我看到VS2008上的C#默认执行此操作(我不知道是否有办法禁用此行为,但我认为检测错误代码非常有用)。有没有办法在java中实现类似的效果?
答案 0 :(得分:3)
查看this article,其中介绍了检查Swing线程违规的RepaintManager
。它不会捕获所有违规行为,但大多数违规行为。
您可以轻松调整该类以抛出Exception
s只打印堆栈跟踪
答案 1 :(得分:1)
将您在代理中使用的每个秋千对象包裹起来,并使用反射生成。使该代理将线程与已知良好的EDT线程进行比较。如果不匹配则抛出RuntimeException。
答案 2 :(得分:1)
看看SwingUtilities.isEventDispatchThread
。如果呼叫是在EDT内进行,则调用此方法将返回true
,否则为false
。
它会完全按照您的意愿行事,问题是您可能需要在代码的多个位置进行此类调用;它的工作量更大。