Files
SSPR_25/bartasova_ksenia_lab_1
2025-03-14 18:37:32 +04:00
..
2025-03-14 18:37:32 +04:00

Лабораторная работа №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 — самый медленный в данном случае.