2012-03-10 5 views
0
// AvgTemp.java 
public abstract class AvgTemp { 
public void notifyReceived (String eventName, Object arg) { 
if (eventName.equals("temperatureMeasurement")) 
      { 
       onNewtemperatureMeasurement((TempStruct) arg); 
      } 
} 
public abstract void onNewtemperatureMeasurement(TempStruct tempStruct); 
} 

// MyAvgTempImpl. java 

public class MyAvgTempImpl extends AvgTemp { 
@Override 
public void onNewtemperatureMeasurement(TempStruct tempstruct) { 

    //TODO : Need to write a code of calculating Average Temperature. 

    } 
} 

Моего вопрос ``, как написать код расчета средней температуры (в MyAvgTempImpl. Java) в ситуации, когда уведомление приходит от многих датчиков (производители температурных данных) ?».Расчет средней температуры, когда есть много производителей температуры

+0

Что такое TempStruct? – Thorn

+0

Является ли onNewtemperatureMeasurement вызывается в однопоточной или многопоточной среде? –

+0

@Thorn: вы можете обойти TempStruct следующим образом: структура TempStruct {double sensedTemperatureValue, Time timeStampOfSensing} – Pankesh

ответ

1

Если эта информация из многих датчиков поступает из одной нити, вы просто суммируете их все и делите на количество полученных выборок.

С другой стороны, если эта информация от многих датчиков поступает из нескольких потоков, то вам придется использовать:

  • синхронизация потоков (с помощью блокировки для защиты суммы в течение дополнений);

или

  • атомарные операции (без блокировки необходимо, так как результат всегда уточненный и действительным);

или

  • делают суммы для каждого потока, а затем сделать сумму всех сумм.

Я не программист на Java, поэтому я не могу сказать, как это делается на Java, но по крайней мере у вас есть общая идея.

+0

@ Спасибо, Гил. Если вы могли бы привести пример в псевдокоде, в Java не нужно. :) – Pankesh

+0

Ну, код peusdo очень похож во всех случаях - единственное, что меняется, - это * реализация * (с использованием зависящих от языка функций). В C я закончил писать свои собственные asm-процедуры для случая № 2 (атомные операции), но если вы хотите, чтобы все было просто, используйте случай №3 (каждый поток суммирует все его значения, а один поток затем делает сумму все суммы). – Gil

+0

Спасибо большое. Позвольте мне попробовать дело № 3. – Pankesh

0

В вашем классе MyAvgTempImpl, добавить два поля: COUNT INT, двойная сумма

В методе onNewtemperatureMeasurement: все почитаю ++ & сумма + = sensedTemperatureValue;

Добавить другой метод вашего класса MyAvgTempImpl:

double getAverage() { 
return sum/count; 
}