Приложение 2 (Практическая часть)
Далее приводится исходный код, который нужно дополнить
Каждый из трех классов реализующий поток по перемножению матриц должен выглядеть примерно так
package potokss;
public class first implements Runnable {
private int n[][];
private int m[][];
private int matr[][];
private int kolstrVAR;
private int kolstoln;
private int kolstolm;
public first(int n[][],int m[][],int kolstrVAR,int kolstoln,int kolstolm,int matr[][])//n-матрица множитель, m-матрица множимая, kolstrVAR- количество строк матрицы n, kolstoln-количество столбцов n kolstolm-количество столбцов m, matr[][]-матрица результат перемножения
{
this.n=n;
this.m=n;
this.matr=matr;
this.kolstrVAR=kolstrVAR;
this.kolstoln=kolstoln;
this.kolstolm=kolstolm; }
@Override
public void run() {
int sum;
sum=0;
// здесь нужно дописать реализацию умножения!!! используя спецификацию //конструктора first
}
}
приведем пример главного класса где идет вызов потоков из сторонних классов
package potokss;
import java.util.Random;
import java.util.RandomAccess;
import java.io.*;
public class glavniy implements Runnable {
private int n[][];
private int m[][];
private int matr[][];
private int kolstrVAR;
private int kolstoln;
private int kolstolm;
public glavniy(int n[][],int m[][],int kolstrVAR,int kolstoln,int kolstolm,int matr[][])//n-матрица множитель, m-матрица множимая, kolstrVAR- количество строк матрицы n, kolstoln-количество столбцов n kolstolm-количество столбцов m, matr[][]-матрица результат перемножения
{/*В каждом классе необходимо переопределить переменные и массивы поступающие из главного класса что бы использовать их во внутренних функциях */
this.n=n;
this.m=n;
this.matr=matr;
this.kolstrVAR=kolstrVAR;
this.kolstoln=kolstoln;
this.kolstolm=kolstolm; }
public glavniy() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
@Override
public void run()//то что выполняется здесь и является потоком
{
int sum;
sum=0;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int kolstol;// количество
int kolstr;//количество строк исходной матрицы
int kolstrVAR;//количество строк матрицы m пересылаемых в один поток
Random rand =new Random();
int matr1[][];
matr1=new int[6][6];//матрица m
int matr2[][];
int matres[][];
matr2=new int[6][2];//матрицы n
//создание матрицы m (n*m)
for(int i=0;i<=5;i++)
{for(int j=0;j<=5;j++)
{matr1[i][j]=2;
}
}
//создание матрицы n (m*n)
for(int i=0;i<=5;i++)
{for(int j=0;j<=1;j++)
{matr2[i][j]=2;
}
}
int matrix[][] = new int[10][10];
int fds[][]=new int [10][10];
//vectormult(matr1,matr2,5,5,1,matrix);//matr1*matr2,kolvo strok matr1,kol stolb matr1,kol stolb matr2, pustaya result matrix
first pot = new first(matr1,matr2,2,5,1,fds);//заносим сформированные переменные в классе glavniy в класс(поток) который мы хотим использовать
Thread das = new Thread(pot); //объявляем поток
das.start();//выполнение умножения в одном из потоков
try {
das.join();
} catch (InterruptedException x) {}
for(int i=0;i<=5;i++)
{System.out.println("");
for(int j=0;j<=1;j++)
{System.out.print(fds[i][j]+" ");}
}
// в результате получим матрицу 24 24
// 24 24
// 24 24
// 0 0
// 0 0
// 0 0
//распределенный посыл
//ввод данных допустим kolstrvar kolstoln-строки и столбцы матрицы n(множителя), kolstolm - количество столбцов множимой матрицы m
//будем исходить из того что у нас в ресурсах три потока и входящие матрицы будем делить на 3 части
int kolstrvar=3;
int kolstoln=34;
int kolstoln1=0;//столбцы матрицы н1 как часть матрицы н
int kolstoln2=0;//столбцы матрицы н2 как часть матрицы н
int kolstoln3=0;//столбцы матрицы н3 как часть матрицы н
int kolstolm=10;
int intPart =(int) Math.floor(kolstoln/3);//целая часть от деления 10/3
//получаем остаток и используем его при формировании третьей матрицы получается 3 матрицы n две по 3 столбца и четвертая 4 столбца
kolstoln1=intPart;
kolstoln2=intPart;
kolstoln3=intPart+(kolstoln-3*intPart);
System.out.print(kolstoln1);
System.out.print(kolstoln2);
System.out.print(kolstoln3);
int matrixn[][]=new int [10][10];//здесь можно задать любой исходный массив в том числе и другой размерности
int matrixm[][]=new int[10][10];//здесь можно задать любой исходный массив в том числе и другой размерности
int matn1[][];//массивы разбиения matrixn
int matn2[][];//массивы разбиения matrixn
int matn3[][];//массивы разбиения matrixn
int matm1[][];//массивы разбиения matrixm
int matm2[][];//массивы разбиения matrixm
int matm3[][];//массивы разбиения matrixm
/*сформируем матрицы разбиения и умножим их друг на друга т.е. matn1*matm1 и т.д разбивка множимого производится по строкам а множителя по столбцам*/
matn1=new int[kolstrvar][kolstoln1];
matn2=new int[kolstrvar][kolstoln2];
matn3=new int[kolstrvar][kolstoln3];
matm1=new int[kolstoln1][kolstolm];
matm2=new int[kolstoln2][kolstolm];
matm3=new int[kolstoln3][kolstolm];
for(int i=0;i<=kolstrvar;i++)
{
for(int j=0;j<=kolstoln1;j++){matn1[i][j]=matrixn[i][j];}
}
for(int i=0;i<=kolstrvar;i++)
{
for(int j=0;j<=kolstoln1;j++){matn2[i][j]=matrixn[i][j+kolstoln1];}
}
for(int i=0;i<=kolstrvar;i++)
{
for(int j=0;j<=kolstoln3;j++){matn3[i][j]=matrixn[i][j+2*kolstoln1];}
}
for(int i=0;i<=kolstoln1;i++)
{
for(int j=0;j<=kolstolm;j++){matm1[i][j]=matrixm[kolstoln1][j];}
}
for(int i=0;i<=kolstoln1;i++)
{
for(int j=0;j<=kolstolm;j++){matm2[i][j]=matrixm[kolstoln2+kolstoln2][j];}
}
for(int i=0;i<=kolstoln3;i++)
{
for(int j=0;j<=kolstolm;j++){matm3[i][j]=matrixm[j+2*kolstoln][j];}
}
//теперь когда матрицы сформированы необходимо их отправить в три потока
//допишите отправку матриц в три заранее подготовленных потока
}}
