Если у нас есть внешний API, который разрешает максимум 10 одновременных подключений, какой класс из пакета java.util.concurrent ты бы использовал, чтобы ограничить число параллельных вызовов?

Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.

Короткий ответ

Что ответить на собеседовании

Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.

Подробный разбор

Ответ с пояснениями

Подойдёт общий Semaphore с 10 permits: каждый вызов захватывает разрешение и освобождает его после завершения. Это ограничение параллельности, а не числа запросов в секунду.

Для блокирующего клиента:

permits.acquire(); // общий Semaphore(10)
try {
    return api.call();
} finally {
    permits.release();
}

acquire находится до try, чтобы не сделать лишний release при прерывании ожидания. Для ограниченного ожидания используют tryAcquire с timeout. В асинхронном клиенте permit освобождают при фактическом завершении, а не сразу после получения Future. Несколько экземпляров приложения требуют согласования общего лимита.

Источник: docs.oracle.com.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее