2
respostas

Quando executo meu programa da erro

-----> MENSAGEM DE ERRO <------
Exception in thread "Thread-2" Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space
Threads produtoras de mensagens finalizadas!
Fim da execução com sucesso
Exception in thread "main" java.lang.IllegalStateException: Não encontrei a mensagem: 1
    at Alura3.RegistroDeMensagens.main(RegistroDeMensagens.java:28)
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create byte arrau at JPLISAgent.c line: 813
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message can't create byte arrau at JPLISAgent.c line: 813

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-0"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-1"

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-2"

Process finished with exit code 1


-----> MAIN <----

package Alura3;

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

public class RegistroDeMensagens {
    public static void main(String[]args) throws InterruptedException {
        LinkedList<String> mensagens = new LinkedList<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();

        t1.join();
        t2.join();
        t3.join();

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

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

            System.out.println("Fim da execução com sucesso");
        }
        if (mensagens.contains(null)){
            throw new IllegalStateException("Não devia ser null aqui Dentro");
        }
    }
}


----> CLASSE PRODUZ MENSAGENS <---

package Alura3;

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

Olá Jackson,

dá uma olhada com mais calma em

for (int i = comeco; i < fim; fim++)

:)

Pegando o gancho do Alessandro, isso acontece porque você está somando a variável fim e não a variável i.

Para que esse laço termine, você precisa fazer com que i seja igual ou maior que o valor fim.

// DE
 for (int i = comeco; i < fim; fim++ )

//PARA
 for (int i = comeco; i < fim; i++ )

caso a variável fim seja somada, nosso resultado fica assim:

1a volta
comeco = 0
fim = 1000
i = 0 (igual a começo)

2a volta 
comeco = 0
fim = 1001
i = 0 (igual a começo)

3a volta <br/>
comeco = 0
fim = 1002
i = 0 (igual a começo)

Perceba que i nunca é somada, até cair em:

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Thread-2"