Вы можете использовать ExecutorService из java.util.concurrent для выполнения задач измерений. Попробовал набросать.
У меня каждый сенсор для выполнения измерения создает задачу измерения:
public static class Sensor {
private String name;
private int delta = 1;
public Sensor(String name) {
this.name = name;
}
public SensorMeasuring getSensorMeasuringTask() {
return new SensorMeasuring();
}
private class SensorMeasuring implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Запущен сенсор: " + name + " ");
Random random = new Random();
int result = random.nextInt(10) - delta;
System.out.print("Результат: " + result);
return result;
}
}
}
В классе RadioMeter у меня есть список всех сенсоров, в нем я создаю также ExecutorService с пулом на столько потоков, сколько у меня сенсоров:
executorService = Executors.newFixedThreadPool(5);
Потом метод getResult() у RadioMeter у меня получает список всех задач на выполнение измерения от всех сенсоров и отдает их Executor'у(метод invokeAll() ждет, пока все задачи не будут выполнены):
public long getResult(){
List<Callable<Integer>> measuringTasks = new ArrayList<>();
for(Sensor sensor : sensors) {
measuringTasks.add(sensor.getSensorMeasuringTask());
}
List<Future<Integer>> results;
try {
results = executorService.invokeAll(measuringTasks);
return aggregateResults(results);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 0L;
}
Ну и в функции aggregateResults() просто считается среднее значение.