0

我有一个应用程序,其中包含一个主对象(包含 Swing GUI)和一个调用对象的 handle() 方法的支持线程。

我注意到当handle() 方法同步时,当线程使用handle() 方法时,主对象上的GUI 没有响应。代码:

public synchronized void handle()){
//method code
}

我从句柄()中删除了同步关键字,即使线程正在使用句柄()方法,GUI也会响应。

需要注意的一件有趣的事情是,当我使用另一个对象作为锁时,当线程使用 handle() 方法时,GUI 会再次响应。代码:

public void handle(){
    synchronized(anotherObj){
    //method code
    }
}

这表明 Swing GUI 使用同步的方法。我对吗?随时向我指出任何资源 - 找不到我想要的。

谢谢。

4

1 回答 1

2

你的“处理”方法是什么,它有什么作用?我相信 Swing 在大多数情况下不使用同步,并且它的文档实际上在其 API 中声明它不是线程安全的(例如,看一下这里)。相反,它使用单线程进行用户交互和程序绘制,即 EDT 或事件调度线程,并且所有与 Swing 交互的程序都必须通过调用 EDT 上的大多数 Swing 调用来尊重这个单线程模型。我怀疑这是你的问题所在。

有关 Swing 线程和后台线程使用的更多信息,请查看此处:Swing 中的并发

编辑1
(来自我的评论)我还想问,为什么这个方法是同步的?由于我们将所有 Swing 调用排队到事件队列中,这可能不是必需的并且可能是有害的。Swing 程序冻结几乎总是由于并发问题,所以这个讨论是相关的。

您可能想要制作一个小型可编译测试程序(一个SSCCE)来演示您的问题(GUI 冻结)并将其发布在这里,以便我们自己测试它。

于 2011-07-31T04:25:40.740 回答