Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

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

Mesmo com o Vector, estou com o mesmo problema que ocorre no Ex. 3. Eu executo o código abaixo, e só é exibida no console a mensagem "Threads produtoras de mensagens finalizadas!", e o programa não finaliza sozinho.

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++){
            mensagens.add("Mensagem: " + i);
        }
    }
}

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

public class RegistroMensagens {
    public static void main(String[] args) throws InterruptedException {
        Collection<String> mensagens = new Vector<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");
    }
}
3 respostas
solução!

Olá Diego! Respondi em seu outro post, mas irei colocar aqui também...

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!

Olá Romário. Não havia percebido minha falha, muito obrigado mesmo pela ajuda!

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

public class RegistroDeMensagens {

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

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