Deadlock e starvation

2 respostas
U

Olá pessoal,

estou estudando deadlock e starvation em Java e gostaria de ver um exemplo de código em que ocorre essas situações. Infelizmente até agora não encontrei… :frowning:

Alguém por aqui poderia me ajudar?

2 Respostas

B
Starvation:
package testes;

import java.util.Random;
import java.util.Scanner;

public class Starvation
{
    public static void main(String[] args)
    {
        Cesta cesta = new Cesta(20); // buffer

        int qtdProdutores = 5;
        int qtdConsumidores = 5;

        Produtor[] produtores = new Produtor[qtdProdutores];
        Consumidor[] consumidores = new Consumidor[qtdConsumidores];

        for (int i = 0; i < qtdProdutores; i++)
        {
            produtores[i] = new Produtor(cesta);
            produtores[i].start();
        }

        for (int i = 0; i < qtdConsumidores; i++)
        {
            consumidores[i] = new Consumidor(cesta);
            consumidores[i].start();
        }

        Scanner in = new Scanner(System.in);

        while (true)
        {
            String s = in.next();
            
            // Interrompe o programa com S
            if (s.equalsIgnoreCase("S"))
            {
                for (int i = 0; i < qtdProdutores; i++)
                    produtores[i].interrupt();

                for (int i = 0; i < qtdConsumidores; i++)
                    consumidores[i].interrupt();
                
                break;
            }
        }
    }
}

class Cesta
{
    private int qtd;
    private int máximo;

    public Cesta(int máximo)
    {
        this.máximo = máximo;
    }

    synchronized public boolean coloca()
    {
        if (qtd == máximo)
            return false;

        qtd++;
        return true;
    }

    synchronized public boolean retira()
    {
        if (qtd == 0)
            return false;

        qtd--;
        return true;
    }
}

abstract class ProdCons extends Thread
{
    Cesta cesta;
    Random rand = new Random();

    public ProdCons(Cesta cesta)
    {
        this.cesta = cesta;
    }

    abstract void executa();

    @Override
    public void run()
    {
        boolean continua = true;
        while (continua)
        {
            executa();
            continua = espera(1000);
        }
    }

    boolean espera(int n)
    {
        try
        {
            sleep((int) (rand.nextFloat() * n));
        }
        catch (InterruptedException ex)
        {
            return false;
        }
        return true;
    }
}

class Consumidor extends ProdCons
{
    public Consumidor(Cesta cesta)
    {
        super(cesta);
    }

    @Override
    void executa()
    {
        if (cesta.retira() == false)
        {
            System.out.println(toString() + ": Estou com fome!");
            // Aumenta o tempo de espera par adar tempo de produzir.
            espera(2000);
        }
    }
}

class Produtor extends ProdCons
{
    public Produtor(Cesta cesta)
    {
        super(cesta);
    }

    @Override
    void executa()
    {
        if (cesta.coloca() == false)
        {
            System.out.println(toString() + ": Jogando o produto fora!");
            // Aumenta o tempo de espera par adar tempo de consumir.
            espera(2000);
        }
    }
}
U

Obrigado Bruno Laturner!

É que não tenho muita facilidade com inglês, e tudo q achava no google tava em english… :frowning:

Criado 18 de maio de 2008
Ultima resposta 20 de mai. de 2008
Respostas 2
Participantes 2