用java模拟N个传感器的计数
我需要在Java N中模拟传感器,这些传感器在随机时间向我发送一个观察信号。其中观察值包含更多值,如: 时间戳-温度-湿度- 当我收到N个传感器中任何一个传感器的观察结果(所有传感器的观察时间都是随机的)时,我需要调用一个rutine R,它通过一些计数刷新数据结构(在所有传感器之间是通用的) 我需要同步R呼叫,如果我第一次呼叫R第二次呼叫R,我需要R第一次完成他的工作 我所有的观察结果实际上都存储在一个CSV文件中,一个用于传感器的文件。但我需要模拟“在线流” 我怎样才能用Java实现呢?如果我让N个线程(一个用于传感器)读取他的CSV文件,我就无法在所有CSV上以正确的时间顺序读取观察结果。 例如,如果我有2个csv:用java模拟N个传感器的计数,java,multithreading,csv,Java,Multithreading,Csv,我需要在Java N中模拟传感器,这些传感器在随机时间向我发送一个观察信号。其中观察值包含更多值,如: 时间戳-温度-湿度- 当我收到N个传感器中任何一个传感器的观察结果(所有传感器的观察时间都是随机的)时,我需要调用一个rutine R,它通过一些计数刷新数据结构(在所有传感器之间是通用的) 我需要同步R呼叫,如果我第一次呼叫R第二次呼叫R,我需要R第一次完成他的工作 我所有的观察结果实际上都存储在一个CSV文件中,一个用于传感器的文件。但我需要模拟“在线流” 我怎样才能用Java实现呢?如果
Csv1:
18:00 - low - low
19:00 - low - high
Csv2
18:03 - high - low
我需要首先在csv1中的18:00用观察刷新计数,然后在csv2中的18:0用观察刷新计数,最后在csv2中的19:00用观察刷新计数
EDIT1:我已经用SynchronousQueue做了一个测试,因为我需要同步我的N个线程,我的问题是当一个线程在计数结构上做了一些事情,而另一个线程无法访问它。
我发现这个例子:
package threadTest;
import java.util.concurrent.SynchronousQueue;
public class SynchronousQueueTest
{
private SynchronousQueue sq = new SynchronousQueue(true);
class PutThread implements Runnable
{
public void run()
{
for(int i=0; i <1000; i++)
{
try {
System.out.println("PUT");
//sq.put("A");
sq.put("A");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class TakeThread implements Runnable
{
public void run()
{
for(int i=0; i <1000; i++)
{
try {
System.out.println("TAKE");
System.out.println(sq.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args)
{
new Thread((new SynchronousQueueTest()).new PutThread()).start();
new Thread((new SynchronousQueueTest()).new TakeThread()).start();
}
}
但我希望有1000个投手和1000个替补投手。有什么问题吗?哈。这听起来很像我通常在为回测准备股票行情数据时所做的 通常,您会将CSV文件至少按内部时间顺序进行处理。然后,您可以读取它们并在开始时进行合并,或者如果您有多个读卡器,则需要将数据放入基于
PriorityQueue
的结构中,例如,DelayQueue
。让您的模拟数据结构包装实际数据并实现Delayed
接口,以便您知道需要多少延迟。这就是你在阅读方面所需要的
从发布端,只需使用一个线程,并发布到您需要的时间-然后安排下一轮的延迟,如1毫秒左右。这通常就足够了
从用户端看,用户是盲的,只需将数据当作真实数据
顺便说一句,如果你真的在做回溯测试,你可能想编写自己的时间服务类,它可以模拟更快的数据滴答声。我不想合并文件,也不想让一个阅读器和一个发布器,因为我处理的是大数据。在这个测试中,我在某台计算机上有一个线程传感器,但将来我需要在更多计算机上并行计算。对于csv的一个线程,我想模拟多台计算机。通常,一个线程足以处理每秒1Gb的消息。所以,除非你需要极高的消息速率。如果你想模拟多台计算机,为什么不实现你定制的分布式优先级队列呢?
PUT
TAKE