5
respostas

Dúvida no Ex. 3 da Aula 6 - Threads

da erro de Exception e aparece "Threads produtoras de mensagens finalizadas!"

RegistroDeMensagens

package br.com.caelum.programa;

import java.util.ArrayList;
import java.util.Collection;

import br.com.caelum.modelo.ProduzMensagens;

public class RegistroDeMensagens {

    public static void main(String[] args) throws InterruptedException {
        Collection<String> mensagens = new ArrayList<String>();

        Thread t1 = new Thread(new ProduzMensagens(0, 10000, mensagens));
        Thread t2 = new Thread(new ProduzMensagens(10000, 20000, mensagens));
        Thread t3 = new Thread(new ProduzMensagens(20000, 30000, mensagens));

        t1.start();
        t2.start();
        t3.start();

        // faz com que a thread que roda o main aguarde o fim dessas
        t1.join();
        t2.join();
        t3.join();

        System.out.println("Threads produtoras de mensagens finalizadas!");

        // verifica se todas as mensagens foram guardadas
        for (int i = 0; i < 15000; i++) {
            if (!mensagens.contains("Mensagem " + i)) {
                throw new IllegalStateException("não encontrei a mensagem: " + i);
            }
        }

        // verifica se alguma mensagem ficou nula
        if (mensagens.contains(null)) {
            throw new IllegalStateException("não devia ter null aqui dentro!");
        }

        System.out.println("Fim da execucao com sucesso");
    }
    }

ProduzMensagens

    package br.com.caelum.modelo;

    import java.util.Collection;

    public class ProduzMensagens implements Runnable {
        private int comeco;
        private int fim;
        private Collection<String> mensagens;

        public ProduzMensagens(int comeco, int fim, Collection<String> mensagens) {
            this.comeco = comeco;
            this.fim = fim;
            this.mensagens = mensagens;
        }

        public synchronized void run() {
            for (int i = comeco; i < fim; i++) {
                mensagens.add("Mensagem " + i);
            }
        }
    }

Peço ajuda, por favor

5 respostas

Raphael, tudo bem ?

Cara parece que está tudo certo !

Consegue mostrar a exception que tá aparecendo

Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 49
    at java.util.ArrayList.add(Unknown Source)
    at br.com.caelum.modelo.ProduzMensagens.run(ProduzMensagens.java:18)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "main" java.lang.IllegalStateException: não encontrei a mensagem: 0
    at br.com.caelum.programa.RegistroDeMensagens.main(RegistroDeMensagens.java:31)
Threads produtoras de mensagens finalizadas!

Raphael, a exception: IllegalStateException você mesmo a programou para lançar quando não foi encontrado na lista uma determinada mensagem.

Sobre a ArrayIndexOutOfBoundsException é devido a não utilização de recurso thread safe que isso ocorre, pois existem 3 threads ao mesmo tempo alterando o mesmo objeto chamado ProduzMensagens.

A minha dúvida é a mesma do Raphael o material está afirmando que basta realizar o sychronized feito acima que teríamos o thread safe no arraylist. Ou seja, cada thread iria escrever suas mensagens no arraylist uma após a outra. Assim: t1 escreveria de 0 a 9999 depois t2 escreveria de 10000 a 19999 e finalmente t3 escreveria de 20000 a 29999

Portanto as únicas mensagens para exibir seriam:

 System.out.println("Threads produtoras de mensagens finalizadas!");
 System.out.println("Fim da execucao com sucesso");

Não teríamos mensagens nulas e teríamos todas as mensagens de 0 a 14999

A afirmação no material: https://pasteboard.co/HbiFOFX.png

No meu caso tinha a seguinte exception:

Exception in thread "main" java.lang.IllegalStateException: não encontrei a mensagem: 0

E agora eu digo o material tá certíssimo. O bug estava no seguinte código:

if (!mensagens.contains("Mensagen " + i)) {
                throw new IllegalStateException("não encontrei a mensagem: " + i);
            }

Mensagen com n no lugar do correto Mensagem com m.

Vou te contar galera, eu estou com esses erros bestas me perseguindo!