# Лабораторная работа №1

Разработка многопоточного приложения с использованием Java Concurrency согласно варианту задания.
Необходимо:
1.	Разработать однопоточный вариант алгоритма и замерить время его работы.
2.	Разработать   параллельный   вариант   алгоритма   с   использованием ThreadPoolExecutor и замерить время его работы
3.	Разработать параллельный вариант алгоритма с использованием ForkJoinPoll и замерить время его работы.
Массив генерируется до работы всех вариантов алгоритмов. Все три алгоритма обрабатывают три одинаковых массива.

## Вариант 3
Разделить элементы матрицы на среднее арифметическое всех ее элементов.

### Как запустить лабораторную работу:
javac Main.java компилирует исходный код
java Main команда запускает скомпилированный класс

### Какие технологии использовали:
java.util.concurrent используется для работы с многопоточностью и параллельными алгоритмами.
- ExecutorService и Executors используются для управления пулами потоков и выполнения задач.
- TimeUnit помогает работать с временными интервалами.
- ForkJoinPool, RecursiveAction и RecursiveTask используются для параллельного выполнения задач, которые можно разбить на более мелкие подзадачи.

### Как работает программа:
1. Генерируем матрицу размером 1000*1000
2. Создаем три копии исходной матрицы
3. Класс SingleThreadedMatrixProcessor обрабатывает матрицу в одном потоке
4. Класс ThreadPoolMatrixProcessor обрабатывает матрицу с использованием пула потоков: создается пул потоков, каждая строка матрицы обрабатывается в отдельном потоке
5. Класс ForkJoinMatrixProcessor обрабатывает матрицу с использованием ForkJoinPool и рекурсивного разделения задачи: если блок большой, он разделяется на две части, и каждая часть обрабатывается рекурсивно
6. Выводятся результаты времени выполнения для каждого из трех подходов.
### Тесты:
Single-threaded: 0.015592711 сек
ThreadPoolExecutor: 0.024355768 сек
ForkJoinPool: 0.01131473 сек
### Вывод:
ForkJoinPool — самый быстрый. Однопоточный алгоритм — быстрее, чем ThreadPoolExecutor, но медленнее, чем ForkJoinPool. ThreadPoolExecutor — самый медленный в данном случае.




