gpt4 book ai didi

java - Vector 中的并发线程 (Java)

转载 作者:可可西里 更新时间:2023-11-01 02:40:50 26 4
gpt4 key购买 nike

我正在设计一段多线程代码,其中包括查询多个传感器(通过套接字)的部分,它们的数据首先存储在 Vector 中,然后写入 DB。

整个过程对时间很敏感,因为每个传感器每隔几秒就会更新一次新数据。如果数据没有及时检索,就会丢失。目前,我有一个 Vector of (Custom Sensor Data) 类,它存储从每个传感器获得的信息和关于每个传感器的信息。

计划是为每个传感器打开一个线程(例如,总共 40-50 个,但不想按数量限制,以防以后添加更多传感器)并让它访问并填充特定的(由Vector 的索引)Vector 的单元格。

对 Vector 的这种操作是否被允许和谨慎?此外,了解 TCP/IP 套接字的特性后,我是否有可能通过引入线程(而不是在单个线程中运行所有内容)来大幅加快进程?有没有更好或更优雅的方法来做到这一点?

最佳答案

从你写的看来是一个Queue更合身;您的线程将传感器数据推送到队列中,稍后(可能使用另一个线程)您可以从队列中获取元素并处理它们。Java(至少版本 7 和 8)提供了一些不同的队列实现,甚至可以在多线程环境中使用。正如 Turing85 在他的评论中所写,考虑使用线程池而不是为每个传感器创建一个线程。

编辑:阅读评论似乎有两种不同类型的问题

how to efficiently query the sensors (threads, tasks, pools, etc)

形成看起来您正在连接到传感器以读取数据的问题,并且必须以固定速率为每个传感器完成此操作。您可以使用 ScheduledThreadPoolExecutor并使用方法 scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 其中 Runnable 是从传感器读取数据的对象;您必须为每个传感器安排任务;线程池大小在构造函数中指定。为了最小化线程数,您必须在读取数据的类中尽可能少地执行操作。我建议您将数据放入队列、 map 或集合中,这取决于您的数据结构。该 map 与您提出的 vector 相同,但您可以使用通用键插入数据而不是使用索引,并且您不关心集合的大小。

and how to efficiently organize the data for subsequent database submission

数据在集合中后,您可以读取和处理它们;您可以存储在数据库中,或检查重复项或任何您需要的内容。我更喜欢有两个不同的“层”,一个收集数据,另一个处理收集到的数据;在两者之间放置一个“接口(interface)”可以让您的设计仅在一侧发展而不会触及另一侧。

注意:我的解决方案允许您丢失数据,如果由于某种原因服务器出现故障,集合中尚未处理的数据将不再可用。

关于java - Vector 中的并发线程 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com