Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496

Многопоточное умножение матрицы FixedThreadPool

07.12.2016, 15:19. Показов 2363. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача умножить две матрицы в могопоточном режиме используя FixedThreadPool.
Я создал класс AllTask в котором есть очередь(тут сразу вопрос какую очередь нужно использовать) ArrayBlockingQueue.
В эту очерель я запихиваю обьекты класса Task. В классе Task(implements Callable) храняться значения строки и столбца для вычеления значения результирующей матрицы, и собственно метод call который возвращает это значение.
Я создаю пул с количеством потоков которое равно кол-ву ядер процесора. Вот дальше я понять немогу как работает это пул.
Я вроде как решил но поему это полное г.)
Результат выдает правильный.

Java
1
2
3
4
5
6
7
8
9
10
public class AllTask {
    public BlockingQueue<Task> allTask = new ArrayBlockingQueue<Task>(9);
 
    public void addToQueue(Task task){
        allTask.add(task);
    }
 
    public Queue<Task> getLaaTask() {
        return allTask;
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Task implements Callable<Integer>{
    int a1, a2, a3, b1, b2, b3;
 
    public Task(int a1, int b1, int a2, int b2, int a3, int b3) {
        this.a1 = a1;
        this.a2 = a2;
        this.a3 = a3;
        this.b1 = b1;
        this.b2 = b2;
        this.b3 = b3;
    }
 
    @Override
    public Integer call() throws Exception {
        return (a1*b1 + a2*b2 + a3*b3);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MatrixMain {
    public static void main(String[] args) throws Exception {
        List<Integer> list = new ArrayList<>();
        int[][] mat1 = {{1, 2, 5},
                        {3, 5, 8},
                        {4, 5, 9}};
 
        int[][] mat2 = {{3, 4, 8},
                        {5, 2, 4},
                        {8, 3, 1}};
 
        int[][] mat3 = new int[3][3];
        AllTask allTask = new AllTask();
 
 
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                for (int k = 0; k <= 2; k++) {
                    list.add(mat1[i][k]);
                    list.add(mat2[k][j]);
                }
                allTask.addToQueue(new Task(list.get(0), list.get(1), list.get(2), list.get(3),
                        list.get(4), list.get(5)));
                list.clear();
            }
        }
 
        int core = Runtime.getRuntime().availableProcessors();
        ExecutorService service = Executors.newFixedThreadPool(core);
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (!allTask.getLaaTask().isEmpty()) {
                    Future<Integer> int1 = service.submit(allTask.getLaaTask().remove());
                    mat3[i][j] = int1.get();
                }
            }
        }
        service.shutdown();
        }
    }
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2016, 15:19
Ответы с готовыми решениями:

Многопоточное перемножение матрицы
Написал класс ParallelMatrixProduct, встроенный в класс UsualMatrix для вычисления произведения несколькими потоками. Класс работает, но...

Многопоточное умножение матрицы на вектор
Здравствуйте! Помогите, пожалуйста!!!! Очень нужно Я написала программу умножения матрицы на вектор, но нужно сделать из неё...

Многопоточное умножение матриц
Программа периодически (примерно 1 раз из трех запусков) выводит ошибку о выходе из пределов диапазона. Задание: многопоточно перемножить 2...

3
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.12.2016, 10:07
1. Вам не нужно создавать очередь самому. Внутри ExecutorService уже есть очередь.
Просто делайте submit ваших задач в executor сразу.
2.
Java
1
2
                    Future<Integer> int1 = service.submit(allTask.getLaaTask().remove());
                    mat3[i][j] = int1.get();
Использование многопоточного executora подразумевает, что вы сначала делаете submit всех задач.
А уже потом для них для всех Future вызываете get().
У вас же, так как get() вызывается сразу - никакой параллельной обработки не происходит. Основной поток сразу же блокируется после отправки очередной задачи, и ждёт пока она не посчитается
0
 Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
09.12.2016, 11:07  [ТС]
Извините. Потревожу вас ищё раз)
Так ли оно?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
int core = Runtime.getRuntime().availableProcessors();
        ExecutorService service = Executors.newFixedThreadPool(core);
 
        List<Future<Integer>> future = service.invokeAll(allTask.getLaaTask());
        int count = 0;
 
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++, count++) {
                mat3[i][j] = future.get(count).get();
            }
        }
 
        service.shutdown();
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
09.12.2016, 23:35
Лучший ответ Сообщение было отмечено Borsche как решение

Решение

Borsche, да, можно и так.

Добавлено через 40 минут
Хотя я всё равно не понимаю, зачем вам отдельный класс AllTask )
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.12.2016, 23:35
Помогаю со студенческими работами здесь

Многопоточное умножение матриц
Всем привет! нужно распараллелить матрицу с помощью thread. Пробовал параллелить вычисление каждого элемента, но время порождения потока...

Многопоточное умножение матриц
какой мехнизм применить для равномерного распределения задач для потоков? например матрицы у меня 10х10 а потоков в конструкторе дано будет...

Многопоточное умножение матриц
Всем привет! как создать несколько потоков и передать им параметры, потом остановить и запустить одновременно. пытаюсь понять работу с...

Задано 4 матрицы. Провести сложение, умножение, умножение на число
Задано 4 матрицы A,B,C,D размером 4х4.Вычеслить такие матрицы: F,G,T. G=3/4 A+B F=B*(2D) T=c/5

Класс Квадратная матрица. Методы: умножение на матрицу, умножение на константу, вывод элементов матрицы на дисплей
Задание: Класс «Квадратная матрица». Методы: умножение на матрицу, умножение на константу, вывод элементов матрицы на дисплей. Нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru