Files
SSPR_25/abakarov_arslan_lab_1
Arslan 8979e2477a Update readme.md
чуть-чуть навел красоту
2025-03-22 02:52:52 +04:00
..
2025-03-21 23:16:33 +04:00
2025-03-21 23:16:33 +04:00
2025-03-22 02:52:52 +04:00

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

Разработка многопоточного приложения с использованием Java Concurrency согласно варианту задания.

Необходимо:

Разработать однопоточный вариант алгоритма и замерить время его работы. Разработать параллельный вариант алгоритма с использованием ThreadPoolExecutor и замерить время его работы. Разработать параллельный вариант алгоритма с использованием ForkJoinPoll и замерить время его работы. !!!. Массив генерируется до работы всех вариантов алгоритмов. Все три алгоритма обрабатывают три одинаковых массива.

Вариант задания 1: Разделить элементы матрицы на наибольший элемент.

Как запустить лабораторную работу:

javac ForkJoinMatrixDivider.java компилирует исходный код java ForkJoinMatrixDivider команда запускает скомпилированный класс javac SingleThreadedMatrixDivider.java компилирует исходный код java SingleThreadedMatrixDivider команда запускает скомпилированный класс javac ThreadPoolMatrixDivider.java компилирует исходный код java ThreadPoolMatrixDivider команда запускает скомпилированный класс

Какие технологии использовали:

Java 17+

ExecutorService (ThreadPoolExecutor)

ForkJoinPool

System.currentTimeMillis() для замеров времени выполнения

Как работает программа:

Генерация матрицы:

Программа создаёт двумерный массив заданного размера.

Заполняет его случайными значениями.

Определяет наибольший элемент матрицы.

Однопоточный алгоритм:

Проходит по всей матрице в одном потоке.

Делит каждый элемент матрицы на наибольший элемент.

Записывает результат в новую матрицу.

Измеряет время выполнения.

Параллельный алгоритм с ThreadPoolExecutor:

Создаёт пул потоков с фиксированным количеством потоков (обычно равное количеству ядер CPU).

Делит матрицу на строки, назначая обработку каждой строки отдельному потоку.

Потоки выполняют деление элементов и записывают результаты.

Ожидает завершения всех потоков.

Измеряет время выполнения.

Параллельный алгоритм с ForkJoinPool:

Использует принцип рекурсивного разбиения задач (Fork/Join).

Разбивает матрицу на более мелкие подзадачи, пока они не станут достаточно малы для обработки в одном потоке.

Выполняет деление элементов параллельно.

Объединяет результаты.

Измеряет время выполнения.

Вывод результатов:

Для каждого метода измеряется время выполнения.

Результаты выводятся в консоль.

(Размер матрицы 1000х1000) Single thread alghoritm: 51 ms ThreadPoolExecutor: 150 ms ForkJoinPool: 90 ms

(Размер матрицы 2000х2000) Single thread alghoritm: 242 ms ThreadPoolExecutor: 300 ms ForkJoinPool: 139 ms.

(Размер матрицы 3000x3000) Single thread alghoritm: 452 ms ThreadPoolExecutor: 495 ms ForkJoinPool: 411 ms

Вывод

Использование ForkJoinPool демонстрирует наивысшую эффективность среди многопоточных подходов в этом алгоритме. ThreadPoolExecutor оказывается самым невыгодным из-за значительных накладных расходов, связанных с управлением потоками. Однопоточный метод работает достаточно хорошо на небольших объемах данных, однако с ростом вычислительной нагрузки он существенно уступает ForkJoinPool.