2012-03-10 80 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 2012-03-10 11:53:02

+0

OnNewtemperatureMeasurement是在單線程或多線程環境中調用的嗎? – 2012-03-10 11:53:52

+0

@Thorn:你可以使用Costrider TempStruct,如下所示:結構TempStruct {double sensedTemperatureValue,Time timeStampOfSensing} – Pankesh 2012-03-10 11:57:03

回答

1

如果來自多個傳感器的信息來自單個線程,那麼您只需將它們總和併除以收到的採樣數。

在另一方面,如果從多個傳感器的信息來自多個線程,那麼你將不得不使用:

  • 線程同步(使用鎖來保護加料過程的總和);

  • 原子操作(無鎖因爲結果所需要始終是最新的和有效);

  • 爲每個線程的款項,然後讓所有款項的總和。

我不是Java程序員,所以我不能說這是如何在Java中完成的,但至少您有它的背後的一般想法。

+0

@ Thanks Gil。如果你可以給出僞代碼的例子,在Java中沒有必要。 :) – Pankesh 2012-03-10 12:12:53

+0

好吧,peusdo代碼在所有情況下都非常相似 - 唯一改變的是*實現*(使用語言相關函數)。在C中,我結束了爲case#2(原子操作)編寫自己的asm例程,但是如果您想簡單起見,請使用case#3(每個線程將其所有值的總和,然後一個線程將總和所有的和)。 – Gil 2012-03-10 12:21:33

+0

非常感謝。讓我試一下案例3。 – Pankesh 2012-03-10 12:38:00

0

在你的類MyAvgTempImpl,添加兩個字段:詮釋計數,雙和

在該方法中onNewtemperatureMeasurement:做計數++ &總和+ = sensedTemperatureValue;

添加另一個方法到類MyAvgTempImpl:

double getAverage() { 
return sum/count; 
}