繁体   English   中英

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

[英]GUI doesn't work when synchronized method is run

我有一个带有主对象的应用程序(包含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中声明它不是线程安全的(例如,请查看此处 )。 相反,它使用单个线程进行用户交互和程序绘制,EDT或事件调度线程 ,并且与Swing交互的所有程序必须通过调用EDT上的大多数Swing调用来尊重这个单线程模型。 我怀疑这是你的问题所在。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM