Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Threads - exercicio 2

package br.com.caelum.fj11.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 void run() {
        for (int i = comeco; i < fim; i++) {
            mensagens.add("Mensagem " + i);
        }
    }
}

----
package Testes;

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

import br.com.caelum.fj11.modelo.ProduzMensagens;

public class TestaRegistroDeMensagnes {
    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");
    }
}

A classe esta apresentando erro na execução. primeira execução. Threads produtoras de mensagens finalizadas! Exception in thread "main" java.lang.IllegalStateException: não encontrei a mensagem: 67 at Testes.TestaRegistroDeMensagnes.main(TestaRegistroDeMensagnes.java:30)

Segunda execução Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 109 at java.util.ArrayList.add(Unknown Source) at br.com.caelum.fj11.modelo.ProduzMensagens.run(ProduzMensagens.java:18) at java.lang.Thread.run(Unknown Source) Exception in thread "Thread-2" java.lang.ArrayIndexOutOfBoundsException: 49 at java.util.ArrayList.add(Unknown Source) at br.com.caelum.fj11.modelo.ProduzMensagens.run(ProduzMensagens.java:18) at java.lang.Thread.run(Unknown Source) Threads produtoras de mensagens finalizadas! Exception in thread "main" java.lang.IllegalStateException: não encontrei a mensagem: 1 at Testes.TestaRegistroDeMensagnes.main(TestaRegistroDeMensagnes.java:30)

1 resposta
solução!

Esse era o resultado esperado! Repare que ArrayList nao é thread safe e portanto tem problemas com acesso compartilhado ao mesmo objeto. Em cada execucao o erro pode acontecer em um ponto diferente.

Prossiga com as atividades que vc vai ver como melhorar isso (com locks e ate trocando a colecao pra usar outra alem de ArrayList)