Java - Продолжать отправку вызываемых Задач Исполнителю, пока не будет выполнено условие - PullRequest
0 голосов
/ 02 мая 2020

У меня возникла проблема при попытке использовать ExecutorService для ускорения функции. Я хотел бы иметь возможность сделать следующее:

  1. Чтение пользователя из клиента через какое-то время l oop w / iterator
  2. Затем я хочу взять этого пользователя и передать это задача Callable, которая будет использовать другой клиент для получения некоторой информации об указанном пользователе (пример: размер его имени)
  3. Продолжайте этот процесс, пока итератор пользователя имеет пользователей, и пока мы не найдем 1000 пользователей, которые имеют имена больше 10.
  4. Когда мы достигнем 1000 пользователей, остановите исполнителя и l oop и продолжите работу с этими 1000 пользователями.

Я знаю Future.get () блокируется, поэтому, когда я пытаюсь выполнить get () после submit (), улучшения не происходит, поскольку он все еще последовательный. Я хочу как-то использовать коллекцию фьючерсов или найти другой способ использовать пул потоков для ускорения этого процесса.

Это пример логики c, который не будет работать, потому что мы никогда не получим время от времени l oop, чтобы начать читать ниже. Я не понимаю, где я могу поставить условное. Это все, что я могу изобразить, основываясь на том, что я уже прочитал об ExecutorService, и оно не должно работать. Я хотел бы выяснить правильный лог c реализации этого, поскольку я изо всех сил пытаюсь понять решение здесь. Спасибо!

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<User> futuresList = new ArrayList<>();

Set<User> users = new HashSet<>();
int maxUser = 1000;

while (clientIterator.hasNext()) {

     user = clientIterator.next();

     Future<User> result = executor.submit(() -> someClient.getUser(user));

     futuresList.add(result);

     if (userCount == maxUsers) {
         break;
     }

}

for (Future<User> future : futuresList) {
    if (future.get().getUserNameSize() > 10) {
       users.add(future.get());
       userCount++;
     }   
}

... Continue doing stuff with the 1000 users we retrieved ...
...