2010-02-24 46 views
1

编辑 GUI应用程序:为了使事情clearer-的Java:一个后台线程

我有一个连接到远程服务器,并更新了GUI的应用程序。该应用程序使用MVC模式。

1)远程服务器可以发送更新我的应用程序的数据模型的消息。

2)GUI控制器类实现的PropertyChangeListener接口,并监听在模型的更新,并更新GUI视图类

3)应用程序能够将消息发送回远程服务器的用户以下在GUI上采取行动。这使用从远程服务器接收数据的相同对象。

我目前初始化“远程服务器通信”对象和在我的主要方法的GUI类。由于通信对象可以独立更新模型,我应该使用SwingUtilities.invokeLater()初始化这个对象吗?

回答

2

我不能完全肯定我得到你,但我只是有一件事anyway--

抛出确保您触摸界面的任何时间,它的AWT线程。在理论上,这意味着即使创建GUI(虽然在实践中,很少有创造给你的主或者一些其他线程的线程的GUI问题,但Sun并在一个点上检测到问题,并提出反对)

无论如何,这意味着您可以在任何时候想要从其他线程更新GUI时使用invokeLater。期。

(注意,只要GUI通过回调(ActionListener的,等等),这将永远是AWT线程,所以你可以做你想要使用回调函数内的GUI什么叫你。

随着修改后的消息,我可能会提示,如果你有线程争用的可能性并且正在做GUI I/O,处理它的一种方法就是在invokeLater中完成所有“有争议”的事情。

尽管在您的主线程中实例化一个图形用户界面(在理论上所有的setVisible(true)都是合法的),如果有来自另一个线程的冲突的可能性,invokeLater会处理所有这些以非常确定的方式。

+0

比尔 - 谢谢。我已经简化了我的原始问题,使其更加清晰。 – Luhar 2010-02-24 18:51:22

1

我的问题是这样的:给供应商代码初始化其自己的连接线,我还是把我所有的远程通信代码(解析事件,更新模型,将消息发送回远程应用程序)在显,将线程分开到初始化GUI的代码?

如果我理解正确的话,这是发生了什么。

的供应商库将开始自己的线程,并最终将回调您的代码给定的方法。

这将更新您的应用程序。一个线程已经在第三方库中使用,这就足够了。

如果你反过来应用与供应商的远程服务器进行通信,您将需要使用自己的线程。那么答案是肯定的。

如果你只是“反应”到什么的供应商库发送给您,则不需要一个单独的线程。

+0

奥斯卡,谢谢你的回复。是的,该应用程序还与远程服务器进行通信。我将不得不考虑重新设计。 – Luhar 2010-02-24 18:33:01

1

SwingUtilities.invokeLater()将直接在GUI的Event Dispatch线程上运行Runnable。

换句话说,从来没有用它来运行后台任务,因为它会停止GUI响应。子集SwingWorker改为,如Sun's tutorial或其他背景Thread所示。