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)