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

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

Utilizo o Eclipse Java Mars, e sempre que executo o código abaixo, ele apenas exibe a mensam no console: "Threads produtoras de mensagens finalizadas!", e não finaliza o programa.

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;
    }

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

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

public class RegistroMensagens {
    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(2000, 30000, mensagens));

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

        //faz com quem 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 mensaagem ficou nula
        if(mensagens.contains(null))
            throw new IllegalStateException("não devia ser null aqui dentro!");
        System.out.println("Fim da execução com sucesso");
    }
}
1 resposta
solução!

Olá Diego! O programa não está finalizando pois está sendo lançada a primeira exceção, com a mensagem "não encontrei a mensagem: 0".

Isso está acontecendo porque você esqueceu de colocar os dois pontos (:) na string que você verifica com o método contains.

Perceba que no run() a string está da seguinte forma:

"Mensagem: " + i

Enquanto na verificação, com o contains, está da seguinte forma:

"Mensagem " + i

É necessário alterar, colocando os dois pontos que estão faltando.

Espero ter ajudado! Bons estudos!