Добавить исполнителей динамически на основе условия в Java - PullRequest
0 голосов
/ 04 февраля 2019

Если StrTemp.equals(true), я хочу код, как показано ниже (у меня 2 потока здесь):

ExecutorService executor = Executors.newFixedThreadPool(2);

Future<String> f1 = executor.submit(new Callable<String >() {
    public String  call() throws Exception {
        return dao.getS4PricingResponse(pricingRequestTemp);
    }
});
Future<String> f2 = executor.submit(new Callable<String>() {
    public String call() throws Exception {
        return dao.getS4ProductResponse(productRequestTemp);
    }
});

Если это не так, я хочу создать три потока.Я добавлю еще один f3=executor.submit.Как я могу решить это динамически и сделать это более эффективным?

1 Ответ

0 голосов
/ 04 февраля 2019

Вы смешиваете две вещи, которые не принадлежат друг другу.

  • служба исполнителя и ее задачи: эта служба не знает или не заботится о том, сколько потоков будет для выполнения задач,Другими словами: просто отправьте свои рабочие элементы в него.
  • , но вы должны "исправить" количество потоков заранее, и простое решение будет выглядеть так:

так:

int numThreads = (whateverStrTemp.equals(somethingElse)) ? 2 : 3;
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
// now submit all the tasks you want to submit ...

Что касается комментария: это не легко возможно.Вызовы метода различаются в двух аспектах: вызываемый метод и передаваемый параметр!Вы можете поместить лямбды для различных вызовов в карту, но вам, вероятно, понадобится другая карта , которая содержит лямбду, которая выбирает параметр для передачи первой лямбде.С этой точки зрения, я не вижу разумного способа рефакторинга просто этого кода.

Я бы отступил назад и посмотрел на основную проблему, которую вы пытаетесь решить, и посмотрел быв способы конструирования этого по-другому, чтобы найти лучшее решение.

Помимо этого, вы можете поместить весь этот код в один цикл и добавить фьючерсы в List<Future<String>> вместо создания переменных f1, f2, ... (подсказка: всякий раз, когда вы начинаете использовать такие имена, как foo1, foo2, ... вы должны немедленно остановиться и использовать массив или список).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...