public static void checkDispatchThread() {
if(!SwingUtilities.isEventDispatchThread()) {
throw new RuntimeException("GUI change made outside AWT dispatch thread");
}
}
我只希望有更一般性的东西。问题描述并不是很清晰,但我希望有人能提出一些好的解决方案 =)
public static void checkDispatchThread() {
if(!SwingUtilities.isEventDispatchThread()) {
throw new RuntimeException("GUI change made outside AWT dispatch thread");
}
}
我只希望有更一般性的东西。问题描述并不是很清晰,但我希望有人能提出一些好的解决方案 =)
我想你在寻找圣杯。就我所知,这并不存在,并且Java不是一种能够轻易创建这种方法的语言。
《Java并发编程实践》中有一节关于测试线程问题的内容。它特别强调了这样做的难度。
除了@Fernando提到的线程死锁之外,多个线程的另一个问题是并发修改及其可能引起的问题。
Java内部做的一件事情是集合类保留了它被更新的次数。然后迭代器在每个.next()上检查该值是否与创建迭代器时的值相同,以查看在迭代期间集合是否已被更新。我认为这个原则可以更普遍地使用。
这两个工具都会分析代码,找出哪些数据可能在线程之间共享,然后它们会对代码进行插桩(向编译后的类中添加额外的字节码),以检查当两个线程尝试同时更改某些数据时是否会出现问题。然后,这两个线程会一遍又一遍地运行,每次启动它们时稍微调整一下时间偏移量,以获得许多可能的访问模式组合。
此外,请查看这个问题:如何对多线程应用程序进行单元测试?
如果您能够确定线程不安全的类,那么静态分析可能会告诉您它们是否“逃逸”以变为对多个线程可见。通常,程序员会在头脑中执行此操作,但显然在这方面他们容易犯错误。工具应该能够使用类似的方法。
话虽如此,从您描述的用例来看,似乎简单记住线程并对其进行断言可能已经足够满足您的需求。
class Foo {
private final Thread owner = Thread.currentThread();
void x() {
assert Thread.currentThread() == owner;
/* Implement method. */
}
}
即使禁用了断言,所有者引用仍然存在,因此它并不完全是“免费”的。我也不想在许多类中添加这个样板。
Thread.holdsLock(Object) 方法对您也可能有用。
就您提供的具体例子而言,SwingLabs有一些辅助代码来检测事件线程违规和挂起。 https://swinghelper.dev.java.net/
一段时间以前,我使用过JProbe Java性能分析工具。他们的一个工具(Threadalyzer?)查找线程同步违规。看看他们的网页,我没有看到那个名字的工具或者我记得的工具。但是你可能需要仔细看一下。http://www.quest.com/jprobe/performance-home.aspx