Java 图形用户界面不';运行同步方法时无法工作

Java 图形用户界面不';运行同步方法时无法工作,java,multithreading,swing,user-interface,synchronize,Java,Multithreading,Swing,User Interface,Synchronize,我有一个应用程序,它有一个主对象(包含Swing GUI)和一个支持线程,该线程调用对象的handle()方法 我注意到,当handle()方法被同步时,当线程使用handle()方法时,主对象上的GUI没有响应。代码: public synchronized void handle()){ //method code } 如果从handle()中删除synchronized关键字,则即使线程使用handle()方法,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
    }
}
这表明SwingGUI使用同步的方法。我说得对吗?请随时向我指出任何资源-无法完全找到我想要的

谢谢

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

有关Swing线程和后台线程使用的更多信息,请查看以下内容:

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


您可能希望制作一个小型可编译测试程序(an),用于演示您的问题(GUI冻结),并将其发布在此处,以便我们自己测试它

@阿米尔:谢谢。你是说你只剩下7张赞成票了吗?啊,我已经考虑过EDT了。但它似乎没有给出任何关于为什么会这样的见解。句柄基本上处理输入并发回服务器响应——它与GUI无关。但是句柄做什么并不重要——区别只在于同步。@worwhite:但它确实重要。您是否从handle方法中进行Swing调用(可能是),是否确保在EDT上调用它?还有,为什么这个方法是同步的?因为您将所有Swing调用排队到事件队列中,所以这可能不是必需的,而且可能是有害的。你可能想制作一个小的可编译程序来演示你的冻结并发布到这里,这样我们就可以自己测试它了。嗯,句柄有时会调用另一个方法(不同步),调用textArea.append()和textField.setText()。但在这种情况下,使用另一个对象作为锁仍然会导致冻结,对吗?该方法是同步的,因为它被其他线程访问,并且可能导致干扰。这是客户机-服务器程序的服务器部分。恐怕发布有点太复杂了。我不是要你发布你的程序,只是一个演示问题的小测试程序。长时间运行的任务可以由Thread.sleep(…)模拟。