# Лабораторная работа №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