【发布时间】:2015-07-14 15:19:53
【问题描述】:
我正在设计一段多线程代码,其中包括查询多个传感器的部分(通过套接字),它们的数据首先存储在 Vector 中,然后写入 DB。
整个过程对时间敏感,因为每个传感器每隔几秒就会更新一次新数据。如果数据没有及时检索,就会丢失。 目前,我有一个(自定义传感器数据)类的向量,它存储从每个传感器获得的信息以及关于每个传感器的信息。
计划是为每个传感器打开一个线程(例如,总共 40-50,但不想限制数量,以防以后添加更多传感器)并让它访问并填充特定的(由向量的索引)向量的单元格。
对 Vector 进行这样的操作是否允许且谨慎?此外,了解 TCP/IP 套接字的特性后,我是否可能通过引入线程(而不是在单个线程中运行所有内容)来大幅加快进程?有没有更好或更优雅的方式来做到这一点?
【问题讨论】:
-
计划是为每个传感器打开一个线程(例如,总共 40-50 个,但不想限制数量,以防以后添加更多传感器)不要那样做。创建许多线程 a) 昂贵且 b) 可能会降低系统速度。使用任务会更好。如果您有套接字,您可以创建一个任务来处理通信并将该任务放入
ExecutorService(例如ThreadPoolExecutor。 -
传感器会写入哪些索引?它是向量中的索引所独有的吗?另请注意,最好不要使用 Java 的
Vector类。 stackoverflow.com/questions/1386275/… -
这就是计划,是的。例如,在 Vector[1] 中包含有关 Sensor #1、Vector[2] ~ Sensor #2 等的信息。这是否意味着如果两个不同的线程尝试修改不同索引处的结构,则会引发异常?
-
同时修改 ArrayList 是不安全的,我想这同样适用于 Vector 类。如果没有重叠索引,则使用普通数组是安全的,但在从其他线程读取数据之前,您仍然需要进行某种同步。在这种情况下,有 AtomicReferenceArray 类,但我不确定它是否适合这种情况,因为您会在旧条目保存到数据库之前丢失它们。
标签: java multithreading sockets vector tcp