Java服务器客户端线程问题

3
你好,我有一个非常简单的客户端-服务器程序,使用模拟简单atm的套接字。在程序的客户端部分中,我有一个GUI类和另一个线程与服务器通信,因此逻辑和GUI分离,并且GUI不会在等待线程与服务器通信时冻结。
我创建了一个线程,因为客户端套接字是在连接时创建并在整个会话期间保持活动状态。问题是,我让线程在无限循环中运行,并询问GUI是否有用户按下任何键,以便处理操作。
对于这个问题,你有什么最佳实践建议吗?由于我正在进行教育目的的开发,所以我不想使用RMI。
干杯
2个回答

5
你可以使用 BlockingQueue。GUI 和客户端线程将访问同一队列对象。响应用户操作,GUI 可以将命令对象放入队列中。客户端线程仍然具有 while 循环,但会使用 take() 从队列中取出命令对象。take() 将使用适当的线程同步原语进行阻塞,因此您不会有忙碌的循环。客户端命令后的服务器响应可能涉及更新某些本地状态和/或更新 GUI,并且我不会感到意外,如果 SwingWorker 参与其中。

有许多解决方法,但这是我想到的第一个。


2
您应该使用更多的线程:一个主线程用于用户界面,一个线程用于与服务器通信(TC),另一个线程包含“业务逻辑”(TBL)。TC和TBL线程应该使用BlockingQueue等待命令(参见命令模式)。
当用户界面中的按钮被点击时,会将命令推入TC或TBL的队列中。它们等待这些命令,执行它们,并创建更多的命令或更新用户界面(使用SwingUtilities.invokeAndWait()SwingUtilities.invokeLater()适当地更新UI)。
这样可以解开所有线程的纠缠。您甚至可以通过在测试中创建命令并将其推入正确的队列来单独测试每个线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接