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

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

Alguem pode testar esse código, e me dizer porque que isso acontece ? Eu tava fazendo uns experimentos doidos aqui, e quando eu usei um set nesse caso, ele não adiciona mais do que uma conta, mesmo eu falando pra ele que eu quero que ele compare uma conta com a outra apenas pelo limite. Mesmo assim eu entendi, mas o que eu achei estranho é que , quando eu mando ele comprara pelo limite , ele só add a conta c1 e a outra não , se eu colocar para comparar pelo saldo ele add as duas contas , porem na hora de imprimir, ele inverte a ordem das contas. Se alguem puder me explicar agradeço. Com outras implementações como ArrayList e LinkedList , funciona, normal.


package Threds_Exercicios4;

import java.util.Set;

public class Conta implements Runnable {

    private double saldo;
    private int limite;
    private Set<Conta> lista;

    public Conta(double saldo, Set<Conta> lista, int limite) {

        this.saldo = saldo;
        this.lista = lista;
    }

    public void run() {

        synchronized (lista) {

            for (int i = 0; i < 300; i++) {

                lista.add(this);
            }

        }

    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + limite;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Conta other = (Conta) obj;
        if (limite != other.limite)
            return false;
        return true;
    }

    public double getSaldo() {

        return this.saldo;
    }

    @Override
    public String toString() {

        return this.getSaldo() + "";
    }

}



package Threds_Exercicios4;

import java.util.HashSet;
import java.util.Set;

public class TestaConta {

    public static void main(String[] args) throws InterruptedException {

        long inicio = System.currentTimeMillis();

        Set<Conta> lista = new HashSet<Conta>();


        Conta c1 = new Conta(333, lista, 500);
        Conta c2 = new Conta(1000, lista, 500);



        Thread t1 = new Thread(c1);
        Thread t2 = new Thread(c2);

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

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

        for (Conta conta : lista) {

            System.out.println(conta);
        }



        long finall = System.currentTimeMillis();

        double total = finall - inicio;

        System.out.println(total);

    }

}
1 resposta
solução!

Olá Marcos! O Problema de seu código é que você esqueceu de no construtor atribuir o valor do limite passado como parâmetro para a variável de instancia limite, recebendo assim as duas contas, por padrão, o valor 0 para limite. Assim, em um Set não é permitido colocar objetos iguais, então quando é feito a comparação para ver se as contas são iguais através do limite é retornado true, pois de fato elas estão com o mesmo limite 0.

Então para resolver bastaria você consertar o construtor, ficando assim:

public Conta(double saldo, Set<Conta> lista, int limite) {
        this.limite = limite;
        this.saldo = saldo;
        this.lista = lista;
    }

Esperto ter ajudado! Bons Estudos!