我正在编写一个连接到Arduino的Java套接字服务器,后者又发送和接收数据。如Java套接字文档所示,我已设置服务器为每个连接打开一个新线程。
我的问题是,我如何能够将数据从套接字线程发送到我的主线程?套接字将不断打开,因此必须在线程运行时发送数据。 有什么建议吗?
更新:服务器的目标是向Arduino发送命令(即打开或关闭灯光)并从传感器接收数据,因此我需要一种方法从连接到各个线程的传感器获取数据并将它们发送到一个。
答案 0 :(得分:3)
在线程之间共享数据总是很棘手。没有"正确"回答,这一切都取决于你的用例。我想你不是在寻找最高性能,但为了方便使用,对吧?
对于这种情况,我建议您查看同步集合,地图,列表或队列。一个看起来非常适合你的课程是 ConcurrentLinkedQueue 。
您还可以使用Collections类中的工厂方法为所有常用集合创建同步代理:
Collections.synchronizedList(new ArrayList<String>());
您不必同步访问它们。
另一种可能是矫枉过正的选择是使用数据库。有一些内存数据库,如H2。
无论如何,我建议您将共享信息量降低到可能的最低水平。例如,您可以保留&#34; raw&#34;每个线程分开的数据(例如在 ThreadLocal 变量中),然后在聚合期间进行同步。
答案 1 :(得分:0)
您似乎有正确的想法 - 您需要一个线程来运行与外部设备的连接,并且您需要一个主线程来运行您的应用程序。
如何在这些线程之间共享数据:这通常不是问题 - 不同的线程可以写入同一个内存;在相同的应用程序线程内共享内存空间。
您可能想要避免的是两个线程同时更改或读取数据 - java提供了一个非常有用的关键字 - synchronized - 来处理这种直接使用的情况并提供您需要的保证。 This is a bit technical但讨论了并发功能。
答案 2 :(得分:0)
这是一个教程,您可以获得更多信息。请注意,快速谷歌搜索会为您的问题提供大量答案。
http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html
在回答您的问题时,您可以使用多个选项将信息从一个线程发送到另一个线程 - 我建议如果它是一个简单的设置,只需使用静态变量/方法来传递信息。
另外作为参考,对于大规模程序,不建议为每个连接启动一个线程。它在较小规模(例如少数客户端)上工作正常,但规模很小。
答案 3 :(得分:0)
如果这是一个Web应用程序,并且您只是要显示任何传感器的当前读数,那么阻塞队列是巨大过度杀伤并且会导致比它解决的问题更多的问题。只需使用所需类型的易失性静态字段。字段本身可以是静态的,也可以驻留在单个对象中,也可以是传递给worker的上下文的一部分。
SharedState
课程中的:
static volatile float temperature;
在帖子中:
SharedState.temperature = 13.2f;
在Web界面中(假设jsp):
<%= SharedState.temperature %>
顺便说一下:如果你想要访问最后10个读数,那么它同样容易:只存储一个包含最后10个读数而不是单个值的数组(只是不要修改里面的内容)相反,替换整个数组 - 否则可能会出现同步问题。