Adição de Matrizes usando Threads[Resolvido]

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?

É uma boa ideia.

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();
    }
}

Qual erro?

O certo nessa linha é fazer:

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

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++; }

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…

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:

[code] 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");
            }
         

        }
    }[/code]

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

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.

[quote=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.

[/quote]

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:

[code] for (int i = 0; i < m1.length; i += qtdProcessos) {//Threads
for (j=j; j < m1.length; j++) {//colunas
for (k=k; k<m1.length; k++) {//linhas
somadoras[i] = new Calculadora(m1, m2, k, j, (k + somaPorThread), (j +somaPorThread));

            }
            
                JOptionPane.showMessageDialog(null,"thread "+i+" foi criada");

        }
    }[/code]&gt;

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