0

我是线程新手。我想在每分钟 24/7 连续不断地与多个传感器进行通信。

Senario: 我有一种与传感器对话的方法,它需要 3 个参数

public String perform(String command, String ip, String port)
{
  //talk to the sensor and then 
  returns reply;
}

我有一个包含传感器详细信息的数据库。

我现在在做什么

while(true)
{
  //get sensors from database

   //run perform method for all instruments
   for(int i=0;i<sensors.length-1;i++)
   {
    //call perform method and save the reply
   }
   Thread.sleep('one minute');
}

问题: 问题是如果我有 100 个传感器并且每个传感器需要 1 秒来回复,然后我将等待 1 分钟,在这种情况下我可能会丢失一些信息。老实说,有时需要一秒钟以上的时间才能做出回应。

我想要做的是,从数据库中获取所有传感器的信息,然后为每个传感器创建一个线程。然后一次运行所有线程,这将返回一些信息。之后等待一分钟,然后再做一次。

任何帮助表示赞赏。

谢谢

4

2 回答 2

2

你看过ScheduledThreadPoolExecutor吗?

一个简单的用法是为每个传感器创建一个Callable,并将线程池配置为包含与传感器一样多的线程。然后提交每个 Callable,指定适当的时间表。

请注意,这种方法不能保证特别准确的计时(Java 绝不是实时平台)。另一个问题是创建大量线程可能会相对占用大量内存(IIRC 每个线程的标准堆分配为 512k,但它是可配置的),如果您有 1000 个传感器,这种方法将无法扩展。

于 2012-06-20T15:42:08.853 回答
0

我个人会采取不同的方法。我会让服务器始终通过 RESTful API 进行侦听,然后让传感器每分钟(或您决定的其他时间间隔)发布它们的状态。这样,服务器和传感器不需要在同一个 JVM 中,恕我直言,更具可扩展性。此外,这样任何传感器也可以通过服务器上的另一个 RESTful API 查询任何其他传感器的状态。

此外,服务器可以启动一个线程来处理每个 POST,如果一个传感器花费很长时间,其他传感器不会被阻塞。

于 2012-06-20T16:04:14.410 回答