Java · 48 строк
На странице каталога 48 карточек. Для каждой нужны цена и остаток на складе — два HTTP-запроса по 30 мс, их делают параллельно. Card, Price, Stock и Clients объявлены рядом.
Юнит-тесты на 2 товара зелёные. После выката первая же полная страница не открылась, а потоки сервиса висят в Future.get. Отметьте строки с ошибками.
В работе: Бэкенд выдачи каталога, сборка карточек товара.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 2 вопроса про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных Яндекс Маркета: выдача каталога. Условие пересказано своими словами.
Давали на собеседовании?
import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class CardAssembler {private final ExecutorService pool = Executors.newFixedThreadPool(8);private final Clients clients;private int slowCards = 0;public CardAssembler(Clients clients) {this.clients = clients;}// Страница каталога: 48 карточек параллельно.public List<Card> page(List<Long> skus) {List<Future<Card>> futures = new ArrayList<>();for (long sku : skus) {futures.add(pool.submit(() -> card(sku)));}List<Card> out = new ArrayList<>();for (Future<Card> f : futures) {try {out.add(f.get());} catch (InterruptedException e) {// прервали — пропускаем карточку} catch (ExecutionException e) {out.add(Card.stub());}}return out;}// Цена и наличие идут параллельно.private Card card(long sku) throws Exception {long start = System.nanoTime();Future<Price> price = pool.submit(() -> clients.price(sku));Future<Stock> stock = pool.submit(() -> clients.stock(sku));Card c = new Card(sku, price.get(), stock.get());if (System.nanoTime() - start > 200_000_000L) {slowCards++;}return c;}}