forked from sevastyan_b/SSPR_25
Лабораторная работа №1
Разработка многопоточного приложения с использованием Java Concurrency. Мой вариант -> 4) Определить минимальный элемент матрицы.
Цель
Сравнить время выполнения трех реализаций алгоритма поиска минимального элемента в большой матрице:
- Однопоточный алгоритм.
- Многопоточный алгоритм с использованием
ThreadPoolExecutor. - Многопоточный алгоритм с использованием
ForkJoinPool.
Все три алгоритма обрабатывают один и тот же массив, который генерируется один раз перед запуском.
Описание программы
-
Генерация матрицы
МетодgenerateMatrix(...)создает матрицу размеромROWS x COLS, заполняя ее случайными числами, используяRandom.nextLong(MaxValue). -
Однопоточный поиск минимума
findMinSingleThread(...)обходит все строки и для каждой строки вызываетfindMinInRaw(...)(локальный поиск минимума в одномерном массиве).- Возвращается общий минимальный элемент по всей матрице.
-
Поиск минимума с
ThreadPoolExecutorfindMinThreadPool(...)создает пул потоков изTHREADS.- Для каждой строки матрицы отправляет задачу (
Callable<Long>), которая в свою очередь вызываетfindMinInRaw(...)для поиска минимума в одной строке. - Собираются результаты всех
Future<Long>, ищется минимальный элемент из их значений.
-
Поиск минимума с
ForkJoinPoolfindMinForkJoin(...)создаетForkJoinPoolи запускает рекурсивную задачуMinTask.MinTask(наследуетRecursiveTask<Long>) делит промежуток строк на две части, пока не достигнет порогаMAX_ROWS. Когда участок достаточно мал, последовательно ищет минимум по строкам.- Объединяет (берет минимум) из двух подзадач.
-
Замер времени
- В
main(...)для каждого из трех алгоритмов замеряется время до и после выполнения (черезSystem.nanoTime()). - Результаты выводятся в консоль.
- В
Как запустить
- Установить JDK (Java 8 или выше).
- Скомпилировать:
javac Main.java - Запустить:
java Main - По завершении вы увидите три строки с минимальным элементом и временем выполнения (в мс) для:
- Однопоточного алгоритма
- Алгоритма с
ThreadPoolExecutor - Алгоритма с
ForkJoinPool
Пример вывода
Single: Min number - 0, Time: 107 мс
ThreadPoolExecutor: Min number - 0, Time: 102 мс
ForkJoinPool: Min number - 0, Time: 63 мс
Числа зависят от размера матрицы и мощности процессора. Чтобы было более наглядно видно разницу по времени между всеми реализации алгоритма, нужно более большую матрицу.
Вывод
- Однопоточный вариант прост в реализации, но при больших размерах матрицы работает долго.
- ThreadPoolExecutor позволяет распараллелить обработку строк матрицы и значительно ускорить поиск.
- ForkJoinPool часто дает еще более высокое ускорение за счет механизма рекурсивного разбиения задач, но реальная производительность зависит от конфигурации процессоров и параметров разбиения.