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…
Alguém por aqui poderia me ajudar?
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…
Alguém por aqui poderia me ajudar?
Starvation:
[code]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);
}
}
}[/code]
Obrigado Bruno Laturner!
É que não tenho muita facilidade com inglês, e tudo q achava no google tava em english…