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