2

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

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

假设我有 2 个线程:EDT 和后台工作者(“BW”)。例如,如果我调用 ,JButton.setText()或者JButton.setIcon()在 BW 中调用,则有可能与 EDT 发生死锁。现在我希望当 BW 调用JButton.setText()和异常被抛出时表明我做错了..

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

4

3 回答 3

3

看看这篇文章,它描述了一个RepaintManager检查 Swing 线程违规的方法。它不会捕获所有违规行为,但会捕获大多数违规行为。

您可以轻松调整该类以抛出Exceptions iso 仅打印堆栈跟踪

于 2012-06-07T21:13:04.503 回答
1

将您拥有的每个摆动对象包装在代理中,通过反射生成。使该代理将线程与已知良好的 EDT 线程进行比较。如果不匹配,则抛出 RuntimeException。

于 2012-06-07T20:51:51.803 回答
1

看看SwingUtilities.isEventDispatchThreadtrue如果调用是从 EDT 内部进行的,则调用此函数将返回,false否则。

它会完全按照您的意愿执行,问题是您可能必须在代码的多个位置进行此类调用;这是更多的工作。

于 2012-06-08T07:59:40.437 回答