【发布时间】:2012-01-08 22:57:01
【问题描述】:
我正在构建一个带有 GUI 和基于套接字的服务器的 Java 应用程序,并且我经常遇到应用程序的一部分卡住等待另一部分的问题(主要是 GUI 等待服务器 - 不令人惊讶。有几次我设法避免了这些错误,相反,我发现自己在启动后几乎立即到达了main 方法的末尾。(应用程序可能会或可能不会继续运行,这取决于是否有任何 GUI 可见或不是,但我认为 main 方法不应该在程序实际退出之前返回......)
我对申请的要求如下:
- 它应该能够同时处理未指定数量的客户端
- 服务器和客户端之间的通信可以双向进行,不一定每隔一圈;有时服务器会发送一堆消息并仅从某些客户端获得回复,有时则相反。
- 客户端连接永远不会“为时已晚” - 只要服务器应用程序正在运行,服务器套接字就需要不断地接受连接。
- 在整个过程中,GUI 应该不受服务器和客户端相互等待的影响。通过后台线程更改的其他对象(主要是模型)上的事件侦听器对 GUI 进行更新。
我尝试了以下方法,但似乎无法正确。
-
main方法的 1 个线程和它创建的对象(控制器、模型等)执行的“常规”工作。这是我有时会遇到问题的线程,因为它不在任何地方都存在并且过早地从main返回。 - 使用
EventQueue.invokeLater(new Runnable() { ... });,我在 UI 线程上执行所有实际的 GUI 操作,但这些调用都不是“幸存的”线程,因此它们基本上只是在主线程之外异步工作。 -
ServerSocket的 1 个线程能够继续侦听新连接。 - 每个客户端有 1 个线程,以便能够监听来自客户端的消息。我不确定这里是否还需要另一个线程,以便能够“乱序”发送消息,即无需等待先接收消息。
我以前从未编写过(真正的)多线程应用程序,所以这对我来说是全新的领域。但是,我不相信这个问题以前没有成功解决过 - 甚至很多次都已经发展出某种最佳实践。
它们是什么?此应用程序的良好架构是什么?
【问题讨论】:
标签: java multithreading sockets user-interface