您好 我有一个非常简单的客户端 - 服务器程序,它使用模拟简单atm的套接字。 在程序的客户端部分,我有一个gui类和另一个与服务器通信的线程,因此gui和逻辑是分开的,并且在等待线程与服务器通信时gui也没有冻结。
我创建了一个线程,因为在连接时创建了clientsocket,并且它贯穿整个会话。问题是我让线程在无限循环中循环并询问gui用户是否按下任何键以便它可以保重的行动。
有关此问题的最佳做法的任何建议? 我不想使用RMI,因为我是出于教育原因而开发的。
干杯
答案 0 :(得分:5)
您可以使用BlockingQueue。 GUI和客户端线程可以访问同一个队列对象。响应用户操作,GUI可以将()命令对象放入队列。客户端线程仍然有一个while循环,BUT将使用take()从队列中拉出命令对象。 take()将阻止使用正确的线程同步原语,因此您不会有繁忙的循环。客户端命令之后的服务器响应可能涉及更新某些本地状态和/或更新gui,如果SwingWorker参与其中,我不会感到惊讶。
有很多方法可以解决这个问题,但这是第一个跳到我脑中的方法。
答案 1 :(得分:2)
您应该使用更多线程:UI的主线程,一个与服务器(TC)通信的线程和一个包含“业务逻辑”(TBL)的线程。 TC和TBL线程应该使用BlockingQueue
来等待命令(参见command pattern)。
单击UI中的按钮时,命令将被推入TC或TBL的队列中。他们等待这些命令,执行它们并创建更多命令或更新UI(根据需要使用SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
。)
这允许您解开所有线程。您甚至可以通过在测试中创建命令并将它们推入正确的队列来单独测试每个命令。