Есть ли способ использовать Future.get () в том же методе без блокировки основного потока

У нас есть временные наблюдения, которые обрабатываются для тысяч показателей, и все они сводятся к одному и тому же методу для обработки через соответствующие процессоры. Я отправляю наблюдения на соответствующий процессор в многопоточном режиме, но future.get () блокирует основной поток дольше, чем ожидалось. Есть ли способ его улучшить?

  ExecutorService[] pools = new ExecutorService[Runtime.getRuntime().availableProcessors()];
...
  @Override
  public Observation apply(final Observation observation) {
    Callable<Observation> task = new Processor(observation);
    int hash = Math.abs(observation.getMetricId().hashCode());

    Future<Observation> result = pools[hash % pools.length].submit(task);
    try {
      return result.get();
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    return null;
  }

Почему у вас несколько пулов и вы сами занимаетесь распределением? Пулы умеют распределять сами себя лучше, чем вы. Это своего рода поражение цели бассейнов. Невозможно вернуть результат будущего, не дождавшись его. Это просто ошибочно. Вы должны изменить свой дизайн. Пусть ваш метод вернет Future<Observation>, а затем пользователь сможет решить, как его обрабатывать, когда блокировать или хочет ли он запланировать задачу по завершении и так далее. Предлагаю вам взглянуть на современную многопоточность в Java, основанную на CompletableFuture.

Zabuzard 01.04.2021 00:28

Является ли цель метода Processor#call возвращать модифицированный Observation? Я пытаюсь прояснить, почему у вас Observation os и на входе, и на выходе ..

Basil Bourque 01.04.2021 00:36

@BasilBourque да Процессор изменяет наблюдение. И измененное наблюдение возвращается процессором, а затем Future.get ()

P K 01.04.2021 00:38

@BasilBourque - это наблюдение, опечатка при редактировании.

P K 01.04.2021 00:44

Если у текущего потока нет другой работы, если вы сразу же запрашиваете результат, почему вы обрабатываете объект Observation в фоновом потоке?

Basil Bourque 01.04.2021 01:49

почему вы должны работать в основном потоке? а почему надо запускать в режиме блокировки?

dung ta van 01.04.2021 07:16

@Zabuzard для метрики, все его наблюдения должны обрабатываться по порядку, поэтому, если поток A обрабатывает наблюдение a, наблюдение b должно обрабатываться A только после того, как наблюдение a было обработано. Вот почему я распространяю хэш-код

P K 01.04.2021 09:22

@dungtavan, потому что мне нужно поддерживать порядок входящих наблюдений

P K 01.04.2021 09:44

Вы можете использовать для этого один пул и настроить очередь задач, таких как pool.submit(firstTask).andThen(secondTask).andThen(thirdTask‌​).andThen(fourthTask‌​)..., просто взгляните на CompletableFuture, как сказано. На самом деле, вы также можете быть в порядке с пулом по умолчанию, поэтому вы можете просто написать CompletableFuture.submit(firstTask).andThen(secondTask).... На самом деле, есть гораздо лучшие решения того, что вы здесь пытаетесь.

Zabuzard 01.04.2021 09:48

Вы просто хотите освободить свою основную ветку, верно? (Я имею в виду, можно ли запускать в другом потоке?)

dung ta van 01.04.2021 10:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
10
48
0

Другие вопросы по теме