58 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа №1. Вариант 16.
**Упорядочить столбцы матрицы по возрастанию суммы их элементов.**
Для работы используем:
1) Однопоточный алгоритм.
2) Многопоточный алгоритм с использованием ThreadPoolExecutor.
3) Многопоточный алгоритм с использованием ForkJoinPool.
## Как запустить лабораторную работу
Сначала компилируем наш код коммандой: javac Main.java
Затем запускаем: java Main
## Технологии
Стандартные библиотеки Java: java.util.concurrent для работы с многопоточностью.
ThreadPoolExecutor: Используется для управления пулом потоков, тут каждый поток вычисляет сумму для отдельного столбца.
ForkJoinPool: Используется для рекурсивного разбиения задачи: делим матрицу пополам рекурсивно, и каждый поток работает с несколькими столбцами.
## Что программа делает
Задача — упорядочить столбцы матрицы по возрастанию суммы их элементов.
Посмотрим поэтапно:
1) Генерируем матрицу случайным образом в зависимости от указанной размерности, диапазон значений может быть от 0 до 99.
2) Записываем в файл input_matrix.txt.
3) Далее используем сначала однопоточный алгоритм: Суммы столбцов вычисляются последовательно, и только потом столбцы сортируются по этим суммам.
4) Теперь посмотрим как работает многопоточный алгоритм с ThreadPoolExecutor: Суммы столбцов вычисляются параллельно с использованием пула потоков, потом столбцы сортируются.
5) Многопоточный алгоритм с ForkJoinPool: Суммы столбцов вычисляются параллельно с использованием ForkJoinPool, который разбивает задачу на подзадачи.
6) Время выполнения каждого алгоритма замеряется и выводится в консоль.
7) Отсортированная матрица записывается в файлы: output_single_thread.txt, output_thread_pool.txt и output_fork_join.txt для каждого из алгоритмов.
Хотя результат работы сортировки и будет одинаковым, итоги всё равно запишем в отдельные файлы.
## Примеры входных и выходных значений
Input lines: 1000
Input columns: 1000
One thread: 611 mc
ThreadPoolExecutor: 128 mc
ForkJoinPool: 76 mc
Input lines: 500
Input columns: 500
One thread: 305 mc
ThreadPoolExecutor: 116 mc
ForkJoinPool: 15 mc
Input lines: 100
Input columns: 100
One thread: 489 mc
ThreadPoolExecutor: 91 mc
ForkJoinPool: 30 mc
Input lines: 10
Input columns: 10
One thread: 186 mc
ThreadPoolExecutor: 20 mc
ForkJoinPool: 4 mc