Maltiplicação de Matrizes com Threads

6 respostas
M

Salve galera,

estou fazendo um trabalho para a faculdade aonde devo multiplicar duas matrizes quadradas de forma sequencial e com Threads. Tudo estava indo muito bem até chegar no momento de implementar as Threads… Bom, a ideia do meu código é a seguinte, a matriz C recebe as matrizes A e B e realiza a multiplicação, segue o código da classe Matriz…

Alguém tem ideia como implemento as Threads ?

package model;

import  java.util.Random;
import  java.lang.Thread;

public class Matriz extends Thread{
    public int colunas;
    public int linhas;   
    public int valoresMatriz [][];
    int nLinhas;
    int nColunas;
        
   public Matriz(int colunas,int linhas){
        this.linhas = linhas;
        this.colunas = colunas;
    }
    public void populaMatriz(){
        for(int i = 0;i<this.getNumeroColunas();i++)
            for(int j = 0;j<this.getNumeroLinhas();j++)
                this.setValoresMatriz(i, j,this.valorAleatorio());
    }
    public int valorAleatorio(){
        return new java.util.Random().nextInt(100) + 1;
    }
    public void multiplicaMatriz (Matriz matriz,Matriz resultado){
        if (this.linhas==matriz.getNumeroColunas()){
            for (int l=0;l<this.colunas;l++){
                for (int c=0;c<matriz.getNumeroColunas();c++){
                    for (int n=0;n<this.linhas;n++){
                        resultado.setValorMatriz(l,n,(this.valoresMatriz[l][n])*(matriz.valoresMatriz[n][c]));
                    }
                }
            }
        }
        else{
            System.out.println("Impossível de ser multiplicada.");
        }
    }
     
    public void setValorMatriz (int x, int y, int valor){
        this.valoresMatriz[x][y]+=valor;
    }
    public int getNumeroLinhas (){
        return linhas;
    }
    public int getNumeroColunas (){
        return colunas;
    }
    public void setNumeroLinhas (int linhas){
        this.linhas = linhas;
    }
    public void setNumeroColunas (int colunas){
        this.colunas = colunas;
    }
    public void setValoresMatriz (int colunas, int linhas,int valor){
        valoresMatriz[linhas][colunas] = valor;
    }
    public int[][] getValoresMatriz (int colunas, int linhas){
        return valoresMatriz;
    }
}

:shock:

6 Respostas

W

Você pelo menos tem o esquema de execução de seu código?

C

Matriz extendendo Thread? :shock:

E

Para multiplicar 2 matrizes usando threads, você precisa pensar em como dividir o trabalho entre as threads, e como coordená-las. Para facilitar, pense em uma matriz com número de linhas (ou colunas, não vi como é seu algoritmo) par, e divida igualmente o trabalho entre 2 threads.

M

entanglement:
Para multiplicar 2 matrizes usando threads, você precisa pensar em como dividir o trabalho entre as threads, e como coordená-las. Para facilitar, pense em uma matriz com número de linhas (ou colunas, não vi como é seu algoritmo) par, e divida igualmente o trabalho entre 2 threads.

Então cara, fiz o que você disse e funcionou, MAS o número de Threads tem que ser dinâmico, ou seja, o usuário escolhe, adaptei o meu código com duas threads fixas mas não funcionou, pode me dizer o que esta errado ? Segue trecho do code.

int numThreads = Integer.parseInt(jTextField1.getText());//Peguei o número de Threads;
            MatrizMecanica m []= new MatrizMecanica[numThreads];
            int inicio = 0;
            int passo = new MatrizMecanica().dividiLinhas(numThreads);
            int fim = passo -1;
            for(int i = 0;i<m.length;i++){
           
                m[i] = new MatrizMecanica(a.pegaValoresMatriz(), b.pegaValoresMatriz(), r, new Point(inicio,0), new Point(fim,99));
                inicio = fim + 1;
                fim = inicio + passo - 1;
            }
            
            long tempoInicio = System.currentTimeMillis();
            
            for(int i = 0;i<m.length;i++){
                m[i].start();
            }
           for(int i = 0;i<m.length;i++){
            try {
                m[i].join();
            } catch (InterruptedException ex) {
                Logger.getLogger(Matriz.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
                
               
        jTextField2.setText(String.valueOf(System.currentTimeMillis() - inicio));

MatrizMecanica é a classe preparada para realizar a multiplicação das matrizes com Threads… Ah, o número de linhas é fixo (100)

V

ola! preciso fazer este mesmo trabalho, mas apenas usando duas threads, vc por um acaso ainda tem este codigo pra me mandar?

L

cara, tbm me perguntei a mesma coisa.

Criado 27 de setembro de 2012
Ultima resposta 31 de jul. de 2013
Respostas 6
Participantes 6