我有一个带有主对象的应用程序(包含Swing GUI)和一个调用对象的handle()方法的支持线程。
我注意到当handle()方法同步时,当线程使用handle()方法时,主对象上的GUI没有响应。代码:
public synchronized void handle()){
//method code
}
我从handle()中删除synchronized关键字,即使线程使用handle()方法,GUI也会响应。
有趣的是,当我使用另一个对象作为锁时,当线程使用handle()方法时,GUI会再次响应。代码:
public void handle(){
synchronized(anotherObj){
//method code
}
}
这表明Swing GUI使用同步的方法。我对吗?随意给我指点任何资源 - 找不到我想要的东西。
感谢。
答案 0 :(得分:2)
你的“句柄”方法是什么?它有什么作用?我认为Swing在大多数情况下不使用同步,并且其文档实际上在其API中声明它不是线程安全的(例如,看看here)。相反,它使用单个线程进行用户交互和程序绘制,EDT或事件调度线程,所有与Swing交互的程序必须通过调用EDT上的大多数Swing调用来尊重这个单线程模型。我怀疑这是你的问题所在。
有关Swing线程和后台线程使用的更多信息,请查看此处:Concurrency in Swing
编辑1
(从我的评论)我还要问,为什么这个方法是同步的?由于我们将所有Swing调用排队到事件队列中,因此这可能不是必需的,并且可能有害。 Swing程序冻结几乎总是由于并发问题,所以这个讨论是相关的。
你可能想要制作一个小的可编译测试程序(SSCCE)来演示你的问题(GUI冻结)并将其发布在这里,以便我们自己测试它。