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

6.Threads - Exercício 1 e 2

Mesmo quando modifiquei o código incluindo a palavra-chave synchronized como é pedido no segundo exercício o programa continua lançando a exceção do primeiro for. Alguém consegue identificar o por que?

Ps: só obtive sucesso na execução quando alterei os valores dos construtores da classe ProduzMensagem para de 0...100, 100...200, 200...300.

import java.util.Collection;

public class ProduzMensagem implements Runnable {

    private int comeco;
    private int fim;
    private Collection<String> mensagens;

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

    @Override
    public void run() {
        // TODO Auto-generated method stub
        synchronized (this) {
            for (int i = comeco; i < fim; i++) {
                mensagens.add("Mensagem " + i);
                System.out.println("Inserindo... - Mensagem " + i);

            }
        }
    }
}


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

public class RegistroDeMensagem {

    /**
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Collection<String> mensagens = new ArrayList<String>();
        Thread thread = new Thread(new ProduzMensagem(0, 10000, mensagens));
        Thread thread2 = new Thread(new ProduzMensagem(10000, 20000, mensagens));
        Thread thread3 = new Thread(new ProduzMensagem(20000, 30000, mensagens));

        thread.start();
        thread2.start();
        thread3.start();

        thread.join();
        thread2.join();
        thread3.join();

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

        for (int i = 0; i < 15000; i++) {
            if (!mensagens.contains("Mensagem " + i)) {
                throw new IllegalStateException("Não encontrei mensagem!");
            }
        }

        if (mensagens.contains(null)) {
            throw new IllegalStateException(
                    "Não deveria ter mensagem nulas aqui...");
        }

        System.out.println("Fim da execução com sucesso.");
    }

}

Exception in thread "main" java.lang.IllegalStateException: Não encontrei mensagem!
    at RegistroDeMensagem.main(RegistroDeMensagem.java:29)
1 resposta
solução!
Diego,
Seu código está errado. Veja o que você fez:
public void run() {
        // TODO Auto-generated method stub
        **synchronized (this)** {
            for (int i = comeco; i < fim; i++) {
                mensagens.add("Mensagem " + i);
                System.out.println("Inserindo... - Mensagem " + i);

            }
        }
    }

Agora veja como deve ser:

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

Percebeu? Você sincronizou o método e não as mensagens que são o que varia realmente. O ponto de sincronismo deve ser o array de mensagens pois são elas que variam entre as theads.