Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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_Sockets - Fatal编程技术网

Java 将数据从多个线程发送到单个线程

Java 将数据从多个线程发送到单个线程,java,multithreading,sockets,Java,Multithreading,Sockets,我正在编写一个Java套接字服务器,它连接到Arduino,Arduino反过来发送和接收数据。正如JavaSocket文档所示,我已经设置了服务器,为每个连接打开一个新线程 我的问题是,如何将数据从套接字线程发送到主线程?套接字将持续打开,因此必须在线程运行时发送数据。 有什么建议吗 更新:服务器的目标是向Arduino发送命令(即打开或关闭照明)并从传感器接收数据,因此,我需要一种方法来从连接到各个线程的传感器获取数据,并将其发送到单个线程中。您似乎有正确的想法-您需要一个线程来运行与外部设

我正在编写一个Java套接字服务器,它连接到Arduino,Arduino反过来发送和接收数据。正如JavaSocket文档所示,我已经设置了服务器,为每个连接打开一个新线程

我的问题是,如何将数据从套接字线程发送到主线程?套接字将持续打开,因此必须在线程运行时发送数据。 有什么建议吗


更新:服务器的目标是向Arduino发送命令(即打开或关闭照明)并从传感器接收数据,因此,我需要一种方法来从连接到各个线程的传感器获取数据,并将其发送到单个线程中。

您似乎有正确的想法-您需要一个线程来运行与外部设备的连接,并且需要一个主线程来运行您的应用程序

如何在这些线程之间共享数据:这通常不是问题——不同的线程可以写入相同的内存;在同一个应用程序中,线程共享内存空间


您可能希望避免的是两个线程同时更改或读取数据—java提供了一个非常有用的关键字—synchronized—来处理这种情况,这种情况可以直接使用,并提供您需要的保证。但是讨论了并发特性。

这里有一个教程,您可以从中获得更多信息。请注意,快速的谷歌搜索将为您的问题提供大量答案

在回答您的问题时,您可以使用许多选项将信息从一个线程发送到另一个线程-我建议如果这是一个简单的设置,只需使用静态变量/方法来传递信息


作为参考,对于大型程序,不建议为每个连接启动线程。它可以在较小的规模上正常工作(例如,少数客户端),但扩展性很差。

在线程之间共享数据总是很棘手的。没有“正确”的答案,这完全取决于您的用例。我想你不是在寻找最高的性能,而是为了易于使用,对吗

对于这种情况,我建议您查看同步的集合、映射、列表或队列。ConcurrentLinkedQueue类似乎非常适合您

还可以使用collections类中的factory方法为所有常用集合创建同步代理:

    Collections.synchronizedList(new ArrayList<String>());
Collections.synchronizedList(新的ArrayList());
您不必同步对它们的访问

另一种可能有些过分的选择是使用数据库。有一些内存中的数据库,比如H2


无论如何,我建议您将共享信息的数量降低到尽可能低的水平。例如,您可以将每个线程的“原始”数据分开(例如,在ThreadLocal变量中),然后在聚合过程中进行同步。

如果这是一个web应用程序,并且您只是要显示任何传感器的当前读数,那么阻塞队列是一个巨大的滥杀行为,将导致比解决问题更多的问题。只需使用所需类型的易失性静态字段。字段本身可以是静态的,也可以驻留在单例对象中,也可以是传递给工作者的上下文的一部分

SharedState
类中:

static volatile float temperature;
在线程中:

SharedState.temperature = 13.2f;
在web界面中(假设为jsp):



顺便说一句:如果您想访问最后10个读数,那么同样简单:只需存储一个带有最后10个读数的数组,而不是单个值(只是不要修改数组中的内容,而是替换整个数组-否则可能会发生同步问题).

我建议您将一些您已经尝试过的东西包括在内,而不是简单地寻找解决方案。还有,就你的问题而言,网上有很多教程,完全是你想要的。我看看能不能很快为你找到一个。需要澄清一下。我没有得到什么是客户端,什么是服务器。哪些数据需要共享(发送)到主线程?套接字线程将数据发送到它所拥有的套接字,因此它不需要将数据发送到主线程就可以将其发送到客户端。我没有尝试将数据发送到客户端,而是尝试将每个套接字线程接收到的所有数据移到一个套接字线程中。您的描述中缺少某些内容。如果你不打算做些什么,从传感器接收数据有什么用?你打算怎么办?为什么它必须在一个线程中完成?无论如何,假设你有一个很好的理由,为什么不使用阻塞队列呢?传感器线程可以从传感器接收数据,并生成消息,它们将这些消息放入队列中。主线程可以使用队列中的消息并对其执行任何操作。感谢链接,但线程没有可以运行然后关闭的特定任务,我的目标是保持它们始终连接,因为数据也必须发送给它们。
<%= SharedState.temperature %>