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

Onde consigo ver no código porque o Programa 1 termina depois do Programa 2?

Pessoal,

Ao alterar o código para exibir as threads desde o inicio,

System.out.print("Programa " + id + " valor: " + i + " / ");

termina exibindo somente o Programa 2.:

Programa 2 valor: 9990 / Programa 2 valor: 9991 / Programa 2 valor: 9992 / Programa 2 valor: 9993 / Programa 2 valor: 9994 / Programa 2 valor: 9995 / Programa 2 valor: 9996 / Programa 2 valor: 9997 / Programa 2 valor: 9998 / Programa 2 valor: 9999 /

Não encontrei diferença no código para isso ocorrer

Abs

Fernando

4 respostas

E aí, Fernando! Tranquilo? =)

Você poderia postar seus códigos aqui para darmos uma olhada, por favor? =)

Fábio

Blz Fábio,

Segue códigos:

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

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

public class RegistroDeMensagens {

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

Grato

solução!

Olá Fernando, blz? Acho que entendi o que está errado. O sysout a que você se refere no início :

System.out.print("Programa " + id + " valor: " + i + " / ");

É de um exercício que tem por teste o seguinte main:


public class TestaPrograma {

    public static void main(String[] args) {
        Programa p1 = new Programa();    
        p1.setId(1);

        Thread t1 = new Thread(p1);
        t1.start();

        Programa p2 = new Programa();    
        p2.setId(2);

        Thread t2 = new Thread(p2);
        t2.start();   
    }

}

Já este outro código que você postou no comentário se refere a um exercício diferente, onde o resultado é algo assim:

Iniciado sequencia de 0 a 10000 Iniciado sequencia de 10000 a 20000 Iniciado sequencia de 20000 a 30000 Threads produtoras de mensagens finalizadas! Fim da execucao com sucesso

Assumindo que sua dúvida foi no exercício que tem este seu sysout da postagem, ao executar diversas vezes, você notará que o resultado no console nunca é igual, e se observar bem conforme os prints vão ocorrendo, você verá tanto Programa 1 como Programa 2, o problema é que a View Console tem um tamanho máximo de output que consegue guardar, e ai quando chega no limite vai sumindo o mais antigo, por isso que nesse caso você as vezes executa e quando rola toda a barra de rolagem, vê apenas Programa 1 ou Programa 2 (isso apenas significa que próximo do fim da execução a thread que faltava exibir valores e foi executando até terminar lotou a visualização do Console apenas com os prints dela, mas basta executar várias vezes que eventualmente verá algo assim:

Programa 2 valor: 9997 Programa 2 valor: 9998 Programa 2 valor: 9999 Programa 1 valor: 6702 Programa 1 valor: 6703 Programa 1 valor: 6704 Programa 1 valor: 6705 Programa 1 valor: 6706 Programa 1 valor: 6707

Ou seja, o que está ocorrendo de fato, é que o processador executa um pouco da primeira thread, printando Programa 1..., ai ele executa um pouco da segunda printando Programa 2... e assim vai paralelamente, até que chega um momento em que uma das threads terminou, e a outra ainda tem um poquinho mais para printar, e por vezes a quantidade de prints desta última lota o console. Rode várias vezes e procure que verá esse padrão que citei acima em algum momento.

Para finalizar, pode-se configurar o tamanho máximo de caracteres da View Console do Eclipse para caber mais texto, indo em Window -> Preferences -> Run/Debug -> Console. Aí basta alterar o campo Console buffer size e salvar. Pode-se também deixar ele ilimitado, desmarcando a opção Limit console output.

Abraços.

Olá Emerson

Show de bola, super explicado.

Valeu!