运行同步方法时 GUI 不起作用



我有一个应用程序与一个主对象(包含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使用同步的方法。我说的对吗?请随时为我指出任何资源-我找不到我想要的。

谢谢。

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

有关Swing线程和后台线程使用的更多信息,请查看这里:

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

你可能想做一个小的可编译测试程序(一个SSCCE)来演示你的问题(GUI冻结),并把它贴在这里,这样我们就可以自己测试了。

最新更新