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

标签 java multithreading swing user-interface synchronize

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

谢谢。

最佳答案

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

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

编辑 1
(来 self 的评论)我还想问,为什么这个方法是同步的?由于我们将所有 Swing 调用排队到事件队列中,因此这可能没有必要,而且可能有害。 Swing 程序卡住几乎总是由于并发问题造成的,因此本次讨论是相关的。

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

关于java - 运行同步方法时 GUI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6887526/

相关文章:

java - 如何在此处修复 java.lang.IndexOutOfBoundsException 错误?

java - 一次只允许一个线程使用一个对象

java - 在 JPanel 中重置图形

java - 按 rowid 为特定行着色

java - 将列表分成组

java - 将图像(字节数组)写入hdfs

c++ - 通过线程实现游戏引擎确定性

c++ - Boost::mutex - 是否可以将它锁定在一个类函数中并在另一个类函数中解锁?

java - 分发我的 java 应用程序,如何管理目录

java - 创建文本文件 Java 时出错