Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器客户端线程问题_Java_Multithreading_User Interface_Client Server - Fatal编程技术网

Java服务器客户端线程问题

Java服务器客户端线程问题,java,multithreading,user-interface,client-server,Java,Multithreading,User Interface,Client Server,你好 我有一个非常简单的客户机-服务器程序,它使用模拟简单atm的套接字。 在程序的客户机部分,我有一个gui类和另一个与服务器通信的线程,这样gui和逻辑就分开了,而且gui在等待线程与服务器通信时不会冻结 我创建了一个线程,因为clientsocket是在连接时创建的,并贯穿整个会话。问题是,我让线程在一个无休止的循环中循环,并询问gui用户是否按下了任何键,以便它能够处理操作 在这个问题上有什么最佳做法的建议吗? 我不想使用RMI,因为我是出于教育原因而开发的 干杯你可以用一杯。GUI和客

你好 我有一个非常简单的客户机-服务器程序,它使用模拟简单atm的套接字。 在程序的客户机部分,我有一个gui类和另一个与服务器通信的线程,这样gui和逻辑就分开了,而且gui在等待线程与服务器通信时不会冻结

我创建了一个线程,因为clientsocket是在连接时创建的,并贯穿整个会话。问题是,我让线程在一个无休止的循环中循环,并询问gui用户是否按下了任何键,以便它能够处理操作

在这个问题上有什么最佳做法的建议吗? 我不想使用RMI,因为我是出于教育原因而开发的

干杯

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


有很多方法可以解决这个问题,但这是我想到的第一个方法。

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

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

这允许您解开所有线程。您甚至可以通过在测试中创建命令并将它们推送到正确的队列中来分别测试它们