用java模拟N个传感器的计数

用java模拟N个传感器的计数,java,multithreading,csv,Java,Multithreading,Csv,我需要在Java N中模拟传感器,这些传感器在随机时间向我发送一个观察信号。其中观察值包含更多值,如: 时间戳-温度-湿度- 当我收到N个传感器中任何一个传感器的观察结果(所有传感器的观察时间都是随机的)时,我需要调用一个rutine R,它通过一些计数刷新数据结构(在所有传感器之间是通用的) 我需要同步R呼叫,如果我第一次呼叫R第二次呼叫R,我需要R第一次完成他的工作 我所有的观察结果实际上都存储在一个CSV文件中,一个用于传感器的文件。但我需要模拟“在线流” 我怎样才能用Java实现呢?如果

我需要在Java N中模拟传感器,这些传感器在随机时间向我发送一个观察信号。其中观察值包含更多值,如:

时间戳-温度-湿度-

当我收到N个传感器中任何一个传感器的观察结果(所有传感器的观察时间都是随机的)时,我需要调用一个rutine R,它通过一些计数刷新数据结构(在所有传感器之间是通用的)

我需要同步R呼叫,如果我第一次呼叫R第二次呼叫R,我需要R第一次完成他的工作

我所有的观察结果实际上都存储在一个CSV文件中,一个用于传感器的文件。但我需要模拟“在线流”

我怎样才能用Java实现呢?如果我让N个线程(一个用于传感器)读取他的CSV文件,我就无法在所有CSV上以正确的时间顺序读取观察结果。 例如,如果我有2个csv:

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