2011-05-27 100 views
3

你好 我有一个非常简单的客户端服务器程序,它使用套接字模拟一个简单的atm。 在程序的客户端部分,我有一个gui类和另一个线程与服务器进行通信,因此gui和逻辑是分开的,并且gui在等待线程与服务器通信时不会冻结。Java服务器客户端线程问题

我创建了一个线程,因为在连接时创建了clientsocket,并且贯穿了整个session.And问题在于我有无限循环中的线程循环并询问gui如果用户按下了任何键,关心行动。

有关此事的最佳实践的任何建议? 我不想使用RMI,因为我正在为教育目的而开发。

干杯

回答

5

你可以使用一个BlockingQueue。 GUI和客户端线程可以访问相同的队列对象。为了响应用户的操作,GUI可以将命令对象放入队列中。客户端线程仍然有一个while循环,但将使用take()将命令对象从队列中拉出。 take()会阻塞使用正确的线程同步原语,所以你不会有一个繁忙的循环。客户端命令后的服务器响应可能涉及更新某些本地状态和/或更新gui,如果涉及SwingWorker,我不会感到惊讶。

有很多方法可以解决这个问题,但这是第一个跳入我脑海的方法。

2

您应该使用更多的线程:UI的主线程,一个与服务器(TC)通信的线程和一个包含“业务逻辑”(TBL)的线程。 TC和TBL线程应使用BlockingQueue来等待命令(请参阅command pattern)。

当单击UI中的按钮时,会将命令压入TC或TBL的队列中。他们等待这些命令,执行它们并创建更多命令或更新UI(根据需要使用SwingUtilities.invokeAndWait()SwingUtilities.invokeLater())。

这使您可以解开所有线程。您甚至可以通过在测试中创建命令并将它们推入正确的队列来逐个测试它们。