Ответы пользователя по тегу Синхронизация данных
  • Как дождаться выполнения всех задач, чтобы выполнить какое то действие в другой задаче?

    @i_visseri
    Вы можете использовать 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() просто считается среднее значение.
    Ответ написан
    Комментировать