Thread

Galera existe algum modo de uma thread esperar outras 4 threads acabarem para ela começar?

1 curtida

CountDownLatch é a classe que você está procurando.

Exemplo de uso:

import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) {
        int numThreads = 4;
        CountDownLatch ferrolho = new CountDownLatch(numThreads);

        for (int i = 0; i < numThreads; i++)
            new Thread(() -> {
                try {
                    System.out.println("Thread " + Thread.currentThread().getName() + " vai dormir...");
                    Thread.sleep(new Random().nextInt(5) * 1000); // dorme de 0 a 4 segundos
                    System.out.println("Thread " + Thread.currentThread().getName() + " acordou!");
                    ferrolho.countDown();
                } catch (InterruptedException e) {
                    System.out.println("Deu ruim no sleep.");
                    Thread.currentThread().interrupt();
                }
            }).start();

        try {
            ferrolho.await(); // espera 4 countDowns no latch
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }

        System.out.println("Essa mensagem só vai ser impressa quando todas as 4 threads terminarem de executar e chamarem o método countDown no Latch.");

    }
}

lvbarbosa Obrigado , vou dar uma olhada agora. Meu professor pediu para pegar uma imagem colorida e transformar ela em uma escala de cinza , mas preciso usar 4 threads. unico modo que pensei foi dividir a image em uma matriz e dividir entre 4 threads.

Essa é uma técnica comum de divisão de trabalho. Nesse caso, é uma divisão boa, pois o tempo de conclusão das 4 sub-áreas vai ser similar.

Existem casos onde uma Thread pode acabar de executar muito mais rápido do que as outras e ficar ociosa, e portanto a divisão deve ser repensada. Certamente esse não é um desses casos.