#478 Параллельный подсчет суммы списка

Компании:
IT_ONE
Темы:
JavaМногопоточностьПрактика

На вход приходит список чисел, мы хотим посчитать сумму всех этих чисел.

Необходимо считать это быстро. Из-за того, что список большой, решено считать сумму так: мы разбиваем входной список на части, используя для этого метод split (на него время тратить не нужно, он здесь просто чтобы библиотеку никакую не тянуть).

Нам это нужно, чтобы каждый подсписок закинуть в отдельный поток, где будет посчитана сумма, и так 10 раз. Когда 10 потоков отработают, мы просто собираем результаты, складываем и получаем итоговую сумму.

/**
 * Посчитать сумму элементов списка (более 1 млн. элементов),
 * используя для этого 10 потоков
*/

public static long sum(List<Long> numbers) {
    final int threads = 10;
    List<List<Long>> subLists = split(numbers, threads);


    // TODO: make it work!

    return ???;

}

private static List<List<Long>> split(List<Long> numbers, int parts) {
    int size = numbers.size();
    int subListSize = (int) Math.ceil((double) size / parts);

    List<List<Long>> result = new ArrayList<>(parts);
    for (int i = 0; i < parts; i++) {
        int fromIndex = i * subListSize;
        if (fromIndex >= size) {
            result.add(Collections.emptyList());
        } else {
            int toIndex = Math.min((i + 1) * subListSize, size);
            List<Long> sublist = numbers.subList(fromIndex, toIndex);
            result.add(sublist);
        }
    }
    return result;
}

Разбор вопроса

Ментор
Ответь как на реальном собеседовании. Я задам уточняющие вопросы, а затем сравню твой ответ с эталонным и покажу точность в %.
Войди, чтобы начать диалог Ментор ведёт диалог по текущему вопросу и учитывает предыдущие сообщения.
Войти