0

私はスレッドに不慣れです。24時間年中無休で毎分複数のセンサーと一度に通信したい。

セナリオ: 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つのスレッドを作成することです。次に、すべてのスレッドを一度に実行すると、いくつかの情報が返されます。その後、1分間待ってから、もう一度実行します。

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

2

ScheduledThreadPoolExecutorを見たことがありますか?

簡単な使用法は、センサーごとにCallableを作成し、センサーと同じ数のスレッドを含むようにスレッドプールを構成することです。次に、適切なスケジュールを指定して、各Callableを送信します。

このアプローチは、特に正確なタイミングを保証するものではないことに注意してください(Javaは決してリアルタイムプラットフォームではありません)。もう1つの問題は、多数のスレッドを作成すると比較的メモリを消費する可能性があり(IIRCはスレッドあたりの標準ヒープ割り当ては512kですが、構成可能です)、数千のセンサーがある場合、このアプローチは拡張できません。

于 2012-06-20T15:42:08.853 に答える
0

個人的には別のアプローチを取ります。サーバーに常にRESTfulAPIを介してリッスンさせ、センサーに1分ごと(または他の間隔)に状態をPOSTさせます。このように、サーバーとセンサーは同じJVM内にある必要はなく、IMHOはよりスケーラブルです。また、このようにして、任意のセンサーがサーバー上の別のRESTfulAPIを介して他のセンサーの状態を照会することもできます。

さらに、サーバーは各POSTを処理するスレッドを開始でき、1つのセンサーに非常に時間がかかる場合でも、他のセンサーはブロックされません。

于 2012-06-20T16:04:14.410 に答える