我是线程新手。我想在每分钟连续 24/7 之后一次与多个传感器通信。
塞纳里奥:我有一种与传感器对话的方法,需要 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 分钟,在这种情况下,我可能会丢失一些信息。老实说,有时需要一秒钟以上的时间才能做出回应。
我想做的是从数据库中获取所有传感器的信息然后为每个传感器创建一个线程。然后一次运行所有线程,这将返回一些信息。之后等待一分钟,然后再次执行。
任何帮助,不胜感激。
谢谢
你看过 ScheduledThreadPoolExecutor 吗?
一个简单的用法是为每个传感器创建一个可调用对象,并将线程池配置为包含与传感器一样多的线程。然后提交每个可调用对象,指定适当的时间表。
请注意,这种方法不能保证特别准确的时间(Java绝不是一个实时平台)。另一个问题是,创建大量线程可能相对占用大量内存(IIRC 每个线程的标准堆分配为 512k,但它是可配置的),如果您有 1000 个传感器,这种方法将无法扩展。
就个人而言,我会采取不同的方法。 我会让服务器始终通过 RESTful API 进行侦听,然后让传感器每分钟(或您决定的其他间隔)发布其状态。 这样,服务器和传感器就不需要在同一个JVM中,恕我直言,可扩展性更强。 此外,通过这种方式,任何传感器也可以通过服务器上的另一个 RESTful API 查询任何其他传感器的状态。
此外,服务器可以启动一个线程来处理每个开机自检,如果一个传感器花费很长时间,其他传感器不会被阻塞。