Войти Регистрация
Конкурентность

15. Пул потоков на каждый запрос

Лёгкая

Java · 33 строк

Экран «Лимиты по картам» открывают около 300 раз в минуту на один инстанс, у клиента в среднем 4 карты. Лимиты каждой карты отдаёт процессинг, обычно за 80 мс.

Отметьте строки с ошибками.

В работе: Бэкенд экрана лимитов в мобильном банке.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
ExecutorServiceshutdownутечка потоковFuture.get

Источник: на задачах Сбера: лимиты по картам. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.Future;
  6. public class LimitsService {
  7. private final LimitClient client;
  8. public LimitsService(LimitClient client) {
  9. this.client = client;
  10. }
  11. // Экран «Лимиты по картам»: вызывается на каждое открытие.
  12. public List<Limit> loadLimits(List<String> cardIds) throws Exception {
  13. ExecutorService pool = Executors.newFixedThreadPool(cardIds.size());
  14. List<Future<Limit>> futures = new ArrayList<>();
  15. for (String id : cardIds) {
  16. futures.add(pool.submit(() -> client.fetch(id)));
  17. }
  18. List<Limit> result = new ArrayList<>();
  19. for (Future<Limit> f : futures) {
  20. result.add(f.get());
  21. }
  22. return result;
  23. }
  24. }
  25. interface LimitClient {
  26. Limit fetch(String cardId) throws Exception;
  27. }
  28. record Limit(String cardId, long dailyLimitRub) {}