【问题标题】:Calculating Average Temperature , when there are many temperature producers计算平均温度,当有许多温度生产者时
【发布时间】:2012-03-10 11:50:03
【问题描述】:
// 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 中)?”。

【问题讨论】:

  • onNewtemperatureMeasurement 是在单线程还是多线程环境中调用的?
  • @Thorn :您可以将 TempStruct 考虑如下:结构 TempStruct { double sensedTemperatureValue, Time timeStampOfSensing }
  • @SamarthBhargava :您可以假设单线程或覆盖线程环境。

标签: java middleware


【解决方案1】:

如果来自多个传感器的信息来自一个线程,您只需将它们全部相加并除以接收到的样本数。

另一方面,如果来自多个传感器的信息来自多个线程,那么您将不得不使用:

  • 线程同步(在加法过程中使用锁来保护总和);

  • 原子操作(不需要锁定,因为结果始终是最新且有效的);

  • 对每个线程求和,然后求所有总和的总和。

我不是 Java 程序员,所以我不知道这在 Java 中是如何完成的,但至少你知道它背后的一般想法。

【讨论】:

  • @谢谢吉尔。如果您可以用伪代码举例,Java 中没有必要。 :)
  • 好吧,peusdo 代码在所有情况下都非常相似——唯一改变的是实现(使用与语言相关的函数)。在 C 语言中,我结束了为案例 #2(原子操作)编写自己的 asm 例程,但如果您想保持简单,请使用案例 #3(每个线程对其所有值求和,然后一个线程求和所有的总和)。
  • 非常感谢。让我试试案例#3。
【解决方案2】:

在您的 MyAvgTempImpl 类中,添加两个字段:int count、double sum

在onNewtemperatureMeasurement方法中:做count++ & sum+=sensedTemperatureValue;

向你的类 MyAvgTempImpl 添加另一个方法:

double getAverage() {
 return sum/count;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多