Adição de Matrizes usando Threads[Resolvido]

13 respostas
dfarias

Olá.
Considere as seguintes matrizes
Matriz A
1 2 3 4 5
2 2 3 4 5
3 2 3 4 5
4 2 3 4 5
5 2 3 4 5

Matriz B
2 -7 1 4 5
6 -6 3 4 2
9 -5 8 4 3
0 -3 3 0 5
1 -1 3 4 1

O usuário informa quantos threads quer, e cada thread cálcula uma quantidade elementos(pode ser uma linha inteira, uma coluna inteira, ou até mais de uma linha ou coluna).

Eu pensei em criar uma classe chamada Matriz para receber as matrizes (A e B) e ao instanciar as threads passar por parâmetro a quantidade de elementos que devem ser somados.

o que vcs acham?

13 Respostas

ViniGodoy

É uma boa ideia.

dfarias

eu não vou implementar desse jeito não. Vai dar muito trabalho.

Agora eu tow com problema pra passar os valores por paramentro pra threads. tá dando erro abaixo

static int[][] m1;//matriz 1
static int[][] m2;//matriz 2
int qtdProcessos = 5;

Calculadora[] somadoras = new Calculadora[qtdProcessos];
 
for (int i = 0; i < m1.length; i += qtdProcessos) {
            for (int j = 0; j < m1.length; j += qtdProcessos) {
               somadoras[i]((m1, m2, i, i, (i + m1.length), (j +m1.length))); //o erro está nessa parte

            }
        }

for (int i=0; i<somadoras.length; i++) {
            somadoras[i].start(); // o método start inicia uma thread  
            contThread++;//obs: eu já tentei usando o arraylist de objetos, só que foi criada apenas uma unica thread
        }

Classe Calculadora

public class Calculadora extends Thread {

    int[][] matrizinternadathread;
    int[][] matrizinternadathread2;
    int x,y,linhas,colunas;
    

    public Calculadora(int[][] matriz,int[][] matriz2, int x, int y, int linhas, int colunas) {
        matrizinternadathread = matriz;
        matrizinternadathread2 = matriz2;
        this.x=x;
        this.y=y;
        this.linhas=linhas;
        this.colunas=colunas;
    }

    public Calculadora() {
    }

    public int[][] criarMatrizAPartirDePedacoOutra() {
        int[][] resultado = new int[x + linhas][y + colunas];
       
        for (int i = x; i < x + linhas; i++) {
            for (int j = y; j < y + colunas; j++) {
                resultado[i][j] = matrizinternadathread[i][j] + matrizinternadathread2[i][j];
                System.out.print(resultado[i][j]+" - ");

            }
        }

        return resultado;
    }

    public void run() {
    criarMatrizAPartirDePedacoOutra();
    }
}
ViniGodoy

Qual erro?

dfarias

ViniGodoy

O certo nessa linha é fazer:

somadoras[i] = new Calculadora(m1, m2, i, i, (i + m1.length), (j +m1.length));
dfarias

Era isso mesmo. Agora ao executar ocorre outro erro:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at Tela.jbExecutarActionPerformed(Tela.java:393)

for (int i=0; i<somadoras.length; i++) { somadoras[i].start(); contThread++; }

ViniGodoy

Isso indica que alguma coisa está nula na linha em que o erro aconteceu.

Procure por alguma coisa que não foi inicializada, como as matrizes m1 ou m2, etc…

dfarias

vc sabe como eu faço para cada thread ficar com um uma parte da matriz? Cada thread efetua uma soma ou um conjunto de somas (Não é pra soma uma linha inteira ou uma coluna inteira e colocar o resultado em uma variavel.
Cada thread pode somar os elementos i0j0, i1j1, i2j2, ... ,iNjN. colocar na matriz 3 e imprimir na tela)

segue uma ilustração:
[img]http://s10.postimage.org/ll8fjz0eh/upload.jpg[/img]

for (int i = 0; i < m1.length; i += qtdProcessos) {
            for (int j = 0; j < m1.length; j += qtdProcessos) {
               
                for (int k = 0; k <m1.length; k++) {// thread x, fique com uma parte da matriz
                    somadoras[i] = new Calculadora(m1, m2, inicioLinha, inicioColuna, (k+finalLinha), (j +finalColuna));
                     JOptionPane.showMessageDialog(null,"thread "+ i +" foi criada");
                }
             

            }
        }
dfarias

Acho que só Silberschatz e Deus podem me ajudar. Alguem tem o contato de algum dos dois ?rsrsr

ViniGodoy

Você já está no caminho. Eu apenas criaria a matriz resultado fora da classe Calculadora. Isso permitira que você compartilhasse ela também entre as Threads.

Além disso, passe parâmetros para a calculadora para ela saber exatamente o que somar.

dfarias
ViniGodoy:
Você já está no caminho. Eu apenas criaria a matriz resultado fora da classe Calculadora. Isso permitira que você compartilhasse ela também entre as Threads.

Além disso, passe parâmetros para a calculadora para ela saber exatamente o que somar.

Criar a matriz resultado, no caso uma classe?

Cara, eu estou achando que é necessário três "for" ao invés de dois.

segue abaixo a minha modificação:
for (int i = 0; i &lt; m1.length; i += qtdProcessos) {//Threads
            for (j=j; j &lt; m1.length; j++) {//colunas
                for (k=k; k&lt;m1.length; k++) {//linhas
                    somadoras[i] = new Calculadora(m1, m2, k, j, (k + somaPorThread), (j +somaPorThread));
                     
                }
                
                    JOptionPane.showMessageDialog(null,"thread "+i+" foi criada");

            }
        }
>
dfarias

dfarias

no caso, eu estou cometendo um erro aqui (me corrijam, se eu estiver errado).
Aqui eu estou varrendo a matriz inteira (m1, m2, k, j, (k + somaPorThread), (j +somaPorThread). no caso eu tenho que informar até onde deve ir, ou seja por parte, ao inves de informar o começo e fim da matriz, logo não passar a matriz inteira. considere uma matriz de 6 linhas e 6 colunas. nesse caso eu posso querer 12 threads, cada thread soma 3 elementos e assim sucessivamente. Desse modo, o primeiro parametro seria (m1, m2, 0, 0, (0), (0 +(somaPorThread-1). ok?

Implementei isso que acabei de falar, porém continua dando erro: Exception in thread “AWT-EventQueue-0” Exception in thread “Thread-7” java.lang.NullPointerException

Criado 1 de novembro de 2012
Ultima resposta 2 de nov. de 2012
Respostas 13
Participantes 2