Лабораторная работа №1. Вариант 16.
Упорядочить столбцы матрицы по возрастанию суммы их элементов.
Для работы используем:
- Однопоточный алгоритм.
- Многопоточный алгоритм с использованием ThreadPoolExecutor.
- Многопоточный алгоритм с использованием ForkJoinPool.
Как запустить лабораторную работу
Сначала компилируем наш код коммандой: javac Main.java Затем запускаем: java Main
Технологии
Стандартные библиотеки Java: java.util.concurrent для работы с многопоточностью. ThreadPoolExecutor: Используется для управления пулом потоков, тут каждый поток вычисляет сумму для отдельного столбца. ForkJoinPool: Используется для рекурсивного разбиения задачи: делим матрицу пополам рекурсивно, и каждый поток работает с несколькими столбцами.
Что программа делает
Задача — упорядочить столбцы матрицы по возрастанию суммы их элементов. Посмотрим поэтапно:
- Генерируем матрицу случайным образом в зависимости от указанной размерности, диапазон значений может быть от 0 до 99.
- Записываем в файл input_matrix.txt.
- Далее используем сначала однопоточный алгоритм: Суммы столбцов вычисляются последовательно, и только потом столбцы сортируются по этим суммам.
- Теперь посмотрим как работает многопоточный алгоритм с ThreadPoolExecutor: Суммы столбцов вычисляются параллельно с использованием пула потоков, потом столбцы сортируются.
- Многопоточный алгоритм с ForkJoinPool: Суммы столбцов вычисляются параллельно с использованием ForkJoinPool, который разбивает задачу на подзадачи.
- Время выполнения каждого алгоритма замеряется и выводится в консоль.
- Отсортированная матрица записывается в файлы: 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