2012-06-20 4 views
0

새로운 스레드입니다. 여러 분의 센서와 매 순간 1 분마다 연중 무휴로 계속 통신하고 싶습니다.다중 센서와 통신하기위한 다중 스레드

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 기다리고있을 것입니다 이 경우 일부 정보가 손실 될 수 있습니다. 솔직히 말해서 응답하는 데 1 초 이상 걸립니다.

내가 원하는 것은이며 모든 센서에 대해 데이터베이스에서 정보를 얻습니다. 다음 각 센서에 대해 하나의 스레드를 만듭니다. 그런 다음 모든 스레드를 한 번에 실행하면 정보가 반환됩니다. 그 후에 1 분을 기다린 다음 다시 시도하십시오.

도움을 주시면 감사하겠습니다.

감사

답변

2

당신은 ScheduledThreadPoolExecutor 봤어?

간단한 사용법은 각 센서에 대해 Callable을 만들고 센서가있는 수만큼의 스레드를 포함하도록 스레드 풀을 구성하는 것입니다. 그런 다음 각 호출 가능 프로그램을 제출하고 적절한 스케줄을 지정하십시오.

이 접근법은 특별히 정확한 타이밍을 보장하지 않는다는 것을 유의하십시오 (자바는 실시간 플랫폼이 아닙니다). 다른 문제는 많은 스레드를 생성하는 것이 상대적으로 메모리를 많이 차지할 수 있다는 것입니다 (스레드 당 표준 힙 할당은 512k이지만 IIRC는 구성 가능합니다). 1000s 센서가있는 경우이 방법은 확장되지 않습니다.

+0

소리가 좋습니다. 내가 추가하고자하는 한 가지 의견은 각 센서가 동시에 발사하지 않도록하는 것입니다. 60000/센서 수 밀리 초의 초기 지연으로 각 센서를 예약하면 최소한의 스레드 수가 사용됩니다. 센서가 100 개인 경우 첫 번째는 0ms 지연, 두 번째는 600ms 지연, 세 번째는 1200ms 등으로 시작하십시오. 이것은 가장 적은 스레드를 사용합니다. 각 여론 조사가 끝나면 각 센서가 1 분 지연되어 다시 제출됩니다. – Gray

+0

+1 Callable 및 ScheduledThreadPoolExecutor에 +1합니다. 시간 제한 및 예외 사항을 계획하고이를 처리하는 방법을 계획하는 것이 좋습니다. 스레드 취소 정책을 무시하지 마십시오. –

+0

@ 그레이 - 센서 호출을 서로 뒤집어 놓는 것이 좋습니다.나는 OP가 분당 같은 순간에 모든 센서의 데이터를 가져와야하는지 또는 일부 왜곡이 받아 들여질 지 여부에 달려 있다고 생각합니다. –

0

개인적으로 나는 다른 접근 방식을 취할 것입니다. 서버가 항상 RESTful API를 통해 수신 대기 한 다음 센서가 매분 (또는 다른 간격을 결정할 때마다) POST 상태가되도록합니다. 이렇게하면 서버와 센서가 동일한 JVM 내에있을 필요가 없으며 IMHO가 확장 가능합니다. 또한이 방법으로 모든 센서는 서버의 다른 RESTful API를 통해 다른 센서의 상태를 쿼리 할 수 ​​있습니다.

또한 서버는 각 POST를 처리하기 위해 스레드를 시작할 수 있으며 한 센서가 매우 오래 걸리면 나머지는 차단되지 않습니다.

+0

이것은 각 센서에서 코드가 실행되고 있음을 의미합니다. OP는 센서 배열에 대한 일종의 IP 게이트웨이 일 뿐이라는 것을 의미합니다. – Gray

+0

예, 그렇습니다. 아마도 그것은 센서와 상호 작용하는 방법을 알고있는 단순한 또 다른 '서비스'일 것입니다. 대리자를 생각해보십시오 ... –

+0

응답 해 주셔서 감사합니다 ... 서버와 센서가 동일한 JVM 내에 있지 않습니다. 그리고 나는 센서를 바꿀 수 없다. 그들은 접근 할 수없는 다른 장치들이다. 나는 16 진수 코드로 응답하는 특정 프로토콜을 사용하는 인터넷을 통해서만 센서에 명령을 보낼 수 있으며 값을 읽을 수있는 형식으로 변환합니다. 그래서 나는 센서를 수정할 수 없다. –