forked from sevastyan_b/SSPR_25
Merge pull request 'ПИбд-21 Валиулов Ильяс Айдарович Лабораторная №1' (#4) from Ilyas/SSPR_25:valiulov_ilyas_lab_1 into main
Reviewed-on: sevastyan_b/SSPR_25#4
This commit is contained in:
commit
50a0e379d3
44
valiulov_ilyas_lab_1/ForkJoin.java
Normal file
44
valiulov_ilyas_lab_1/ForkJoin.java
Normal file
@ -0,0 +1,44 @@
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class ForkJoin {
|
||||
public static int findMax(int[][] matrix) {
|
||||
ForkJoinPool pool = new ForkJoinPool();
|
||||
return pool.invoke(new MaxTask(matrix, 0, matrix.length));
|
||||
}
|
||||
|
||||
private static class MaxTask extends RecursiveTask<Integer> {
|
||||
private final int[][] matrix;
|
||||
private final int startRow;
|
||||
private final int endRow;
|
||||
|
||||
MaxTask(int[][] matrix, int startRow, int endRow) {
|
||||
this.matrix = matrix;
|
||||
this.startRow = startRow;
|
||||
this.endRow = endRow;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Integer compute() {
|
||||
if (endRow - startRow <= 100) {
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (int i = startRow; i < endRow; i++) {
|
||||
for (int j = 0; j < matrix[i].length; j++) {
|
||||
if (matrix[i][j] > max) {
|
||||
max = matrix[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
else {
|
||||
int mid = (startRow + endRow) / 2;
|
||||
MaxTask left = new MaxTask(matrix, startRow, mid);
|
||||
MaxTask right = new MaxTask(matrix, mid, endRow);
|
||||
left.fork();
|
||||
int rightResult = right.compute();
|
||||
int leftResult = left.join();
|
||||
return Math.max(leftResult, rightResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
44
valiulov_ilyas_lab_1/README.md
Normal file
44
valiulov_ilyas_lab_1/README.md
Normal file
@ -0,0 +1,44 @@
|
||||
## Лабораторная работа №1.
|
||||
|
||||
Разработка многопоточного приложения с использованием Java Concurrency согласно варианту задания:
|
||||
|
||||
Вариант 5: Нужно определить максимальный элемент матрицы
|
||||
|
||||
**Необходимо:**
|
||||
|
||||
1. Разработать однопоточный вариант алгоритма и замерить время его работы.
|
||||
2. Разработать параллельный вариант алгоритма с использованием ThreadPoolExecutor и замерить время его работы
|
||||
3. Разработать параллельный вариант алгоритма с использованием ForkJoinPoll и замерить время его работы.
|
||||
|
||||
**Запуск лабораторной работы**
|
||||
> javac main.java SingleThreaded.java ThreadPool.java ForkJoin.java
|
||||
> java main
|
||||
|
||||
**Используемые технологии**
|
||||
* java.util.concurrent - библиотека для разработки многопоточных программ
|
||||
|
||||
**Что делает программа**
|
||||
1. Генерируем матрицу
|
||||
2. Находим максимальный элемент матрицы в однопоточном алгоритме и замеряем время работы алгоритма
|
||||
3. То же самое с помощью ThreadPoolExecutor и ForkJoinPool
|
||||
|
||||
**Тесты**
|
||||
|
||||
Размерность матрицы 1000*1000\
|
||||
Single-threaded time: 17 ms\
|
||||
ThreadPoolExecutor time: 73 ms\
|
||||
ForkJoinPool time: 36 ms
|
||||
|
||||
Размерность матрицы 10000*10000\
|
||||
Single-threaded time: 1639 ms\
|
||||
ThreadPoolExecutor time: 1440 ms\
|
||||
ForkJoinPool time: 464 ms
|
||||
|
||||
**Вывод**
|
||||
|
||||
Для небольших задач реализация многопоточности приводит к более худшему результату, так как ее реализация требует дополнительных затрат
|
||||
|
||||
Однако при больших задачах эти дополнительные затраты незначительны по сравнению с эффективностью паралельной обработки
|
||||
|
||||
При работе с матрицами ForkJoinPool эффективней, чем ThreadedPoolExecutor, так как это связано с тем, что матрицу довольно просто
|
||||
разделить на подзадачи.
|
13
valiulov_ilyas_lab_1/SingleThreaded.java
Normal file
13
valiulov_ilyas_lab_1/SingleThreaded.java
Normal file
@ -0,0 +1,13 @@
|
||||
public class SingleThreaded {
|
||||
public static int findMax(int[][] matrix) {
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (int[] row : matrix) {
|
||||
for (int value : row) {
|
||||
if (value > max) {
|
||||
max = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
}
|
40
valiulov_ilyas_lab_1/ThreadPool.java
Normal file
40
valiulov_ilyas_lab_1/ThreadPool.java
Normal file
@ -0,0 +1,40 @@
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class ThreadPool {
|
||||
public static int findMax(int[][] matrix, int numThreads) throws InterruptedException, ExecutionException {
|
||||
ExecutorService executor = Executors.newFixedThreadPool(numThreads);
|
||||
int rows = matrix.length;
|
||||
int cols = matrix[0].length;
|
||||
int chunkSize = rows / numThreads;
|
||||
Future<Integer>[] futures = new Future[numThreads];
|
||||
|
||||
for (int i = 0; i < numThreads; i++) {
|
||||
int startRow = i * chunkSize;
|
||||
int endRow = (i == numThreads - 1) ? rows : startRow + chunkSize;
|
||||
futures[i] = executor.submit(() -> findMaxInRange(matrix, startRow, endRow));
|
||||
}
|
||||
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (Future<Integer> future : futures) {
|
||||
int localMax = future.get();
|
||||
if (localMax > max) {
|
||||
max = localMax;
|
||||
}
|
||||
}
|
||||
|
||||
executor.shutdown();
|
||||
return max;
|
||||
}
|
||||
|
||||
private static int findMaxInRange(int[][] matrix, int startRow, int endRow) {
|
||||
int max = Integer.MIN_VALUE;
|
||||
for (int i = startRow; i < endRow; i++) {
|
||||
for (int j = 0; j < matrix[i].length; j++) {
|
||||
if (matrix[i][j] > max) {
|
||||
max = matrix[i][j];
|
||||
}
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
}
|
37
valiulov_ilyas_lab_1/main.java
Normal file
37
valiulov_ilyas_lab_1/main.java
Normal file
@ -0,0 +1,37 @@
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.*;
|
||||
|
||||
public class main {
|
||||
public static void main(String[] args) throws InterruptedException, ExecutionException {
|
||||
int[][] matrix = generateMatrix(1000, 1000);
|
||||
|
||||
long startTime = System.nanoTime();
|
||||
int singleThreadedMax = SingleThreaded.findMax(matrix);
|
||||
long endTime = System.nanoTime();
|
||||
System.out.println("Single-threaded max: " + singleThreadedMax);
|
||||
System.out.println("Single-threaded time: " + (endTime - startTime) + " ns");
|
||||
|
||||
startTime = System.nanoTime();
|
||||
int threadPoolMax = ThreadPool.findMax(matrix, 10);
|
||||
endTime = System.nanoTime();
|
||||
System.out.println("ThreadPoolExecutor max: " + threadPoolMax);
|
||||
System.out.println("ThreadPoolExecutor time: " + (endTime - startTime) + " ns");
|
||||
|
||||
startTime = System.nanoTime();
|
||||
int forkJoinMax = ForkJoin.findMax(matrix);
|
||||
endTime = System.nanoTime();
|
||||
System.out.println("ForkJoinPool max: " + forkJoinMax);
|
||||
System.out.println("ForkJoinPool time: " + (endTime - startTime) + " ns");
|
||||
}
|
||||
|
||||
public static int[][] generateMatrix(int rows, int cols) {
|
||||
int[][] matrix = new int[rows][cols];
|
||||
Random random = new Random();
|
||||
for (int i = 0; i < rows; i++) {
|
||||
for (int j = 0; j < cols; j++) {
|
||||
matrix[i][j] = random.nextInt(10000);
|
||||
}
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user