Ajuda sobre Múltiplas Threads

Galera to com o seguinte problema estou tentando mudar as cores de cada pixel de uma imagem só que no processo padrão ele demorava um minuto por imagem e quando uso threads não funciona poderiam me ajudar para ver se tem algum erro no meu código da Thread pois quero que cada Thread murder a cor de um pixel

Como a thread é Chamada

private Bitmap test(File file) {
    Bitmap src = BitmapFactory.decodeFile(file.getPath());
    int width = src.getWidth();
    int height = src.getHeight();
    Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
    int A, R, G, B, pixel;
    for (int x = 0; x < width; ++x) {
        for (int y = 0; y < height; ++y) {
            Teste a = new Teste(x, y, src);
            a.start();
            bmOut.setPixel(a.getX(), a.getY(), Color.argb(a.getA(), a.getGray(), a.getGray(), a.getGray()));

        }
    }

    return bmOut;

}

Código da Thread

class Teste extends Thread {
    int A, R, G, B, x, y, gray;
    Bitmap src;

    public Teste(int x, int y, Bitmap src) {
        this.x = x;
        this.y = y;
        this.src = src;
    }

    public int getA() {
        return A;
    }

    public int getGray() {
        return gray;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void caculo(int x, int y) {
        int pixel = src.getPixel(x, y);
        A = Color.alpha(pixel);
        R = Color.red(pixel);
        G = Color.green(pixel);
        B = Color.blue(pixel);
        int gray = (int) (0.2989 * R + 0.5870 * G + 0.1140 * B);
        // use 128 as threshold, above -> white, below -> black
        if (gray > 128) {
            gray = 255;
        } else {
            gray = 0;
        }
        this.gray = gray;
    }

    @Override
    public void run() {
        super.run();
        caculo(x, y);
    }
}

Codigo do metodo padrão

private Bitmap test2(File file) {
    Bitmap src = BitmapFactory.decodeFile(file.getPath());
    int width = src.getWidth();
    int height = src.getHeight();
    Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
    int A, R, G, B;
    int pixel;
    for (int x = 0; x < width; ++x) {
        for (int y = 0; y < height; ++y) {
            pixel = src.getPixel(x, y);
            A = Color.alpha(pixel);
            R = Color.red(pixel);
            G = Color.green(pixel);
            B = Color.blue(pixel);
            int gray = (int) (0.2989 * R + 0.5870 * G + 0.1140 * B);
            if (gray > 128) {
                gray = 255;
            } else {
                gray = 0;
            }
            bmOut.setPixel(x, y, Color.argb(A, gray, gray, gray));
        }
    }
    return bmOut;

}

Não funciona = ???
Detalhe a situação.

Seria tipo assim quando ele executar a função normal demora menos tempo para funcionar do que quando eu uso threads dentro de Loops for , ou seja quando eu uso as threads o processo ele não acaba mais passa um bom tempo executado e não mostra nada

Você já tentou debugar ?

Acredito que a thread ainda não tenha terminado o processamento, quando você chama bmOut.setPixel()…

Veja esse post, Thread com loop. Acho que pode te dar uma luz, de como resolver seu problema.

e como posso saber quando as threads estão acabando os processos ?

Utilizando o método join(). Ficaria algo parecido com:

a.start();
a.join()
bmOut.setPixel(a.getX(), a.getY(), Color.argb(a.getA(), a.getGray(), a.getGray(), a.getGray()));

Mas, acredito que você não conseguirá benefícios utilizando dessa forma. Porque mesmo com o processamento ocorrendo em uma Thread paralela, ele ainda ocorrerá de forma sequencial.
Seu loop irá iniciar, instanciar a thread, inicia-lá e aguardar até que seja finalizada para depois setar os valores em bmOut. E esse ciclo se repetirá quantas vezes for definido no loop. Consegue entender ? Tudo ocorrerá sequencialmente, igual quando você não usava thread…

De uma olhada no post que te mandei anteriormente, o ViniGodoy explicou como se criar um array de threads, executa-las simultaneamente e depois aguardar o final de todas. Dessa forma sim, talvez você sentisse alguma diferença na velocidade de processamento da sua equação. Porque você poderia ter 2, 5, 10 contas executando simultaneamente.

1 curtida

Eu já tentei usar esse metodo que vc mostrou o
a.start();
a.join()
bmOut.setPixel(a.getX(), a.getY(), Color.argb(a.getA(), a.getGray(), a.getGray(), a.getGray()));

Mais não deu certo vou ver oq vc citou ele vou ver como funciona obg qualquer coisa eu mando a resposta