【问题标题】:GUI doesn't work when synchronized method is run运行同步方法时 GUI 不起作用
【发布时间】:2011-07-31 04:19:41
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: java multithreading swing user-interface synchronize


    【解决方案1】:

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

    更多关于 Swing 线程和后台线程的使用,请看这里:Concurrency in Swing

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

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

    【讨论】:

    • @Amir:谢谢。你的意思是你只剩下 7 个赞成票了吗?
    • 啊,我已经考虑过 EDT。但它似乎没有提供任何关于为什么会这样的见解。句柄基本上处理输入并发送回服务器响应 - 它与 GUI 无关。但句柄的作用无关紧要 - 区别仅在于同步。
    • @worwhite:但这确实很重要。您是否从句柄方法中进行 Swing 调用(可能是),并且您是否确保它在 EDT 上被调用?另外,为什么这个方法是同步的?由于您将所有 Swing 调用排队到事件队列中,因此这可能不是必需的,而且可能是有害的。您可能想制作一个小型可编译程序来演示您的冻结并将其发布在此处,以便我们自己进行测试。
    • 嗯,句柄有时会调用另一个调用 textArea.append() 和 textField.setText() 的方法(未同步)。但是在这种情况下,使用另一个对象作为锁应该仍然会导致冻结,对吗?该方法是同步的,因为它被其他线程访问并可能导致干扰。这是客户端-服务器程序的服务器部分。恐怕发帖有点太复杂了。
    • 我不是要你发布你的程序,只是一个演示问题的小测试程序。可以通过 Thread.sleep(...) 来模拟长时间运行的任务。
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多