Programa Travando

1. Programa Travando

Gabriela
fla_gab

(usa Ubuntu)

Enviado em 24/04/2008 - 09:54h

Bom dia pessoal, fiz o programa do barbeiro dorminhoco em java, porém ele não rodando sempre, como deveria, toda vez que chega a um determinado ponto ele simplesmente pára de rodar, alguém poderia me dizer o que pode ser? aqui está o código:

====> Main:
package barbeirodorminhoco;

public class Main
{

static final int MAXCLIENTES = 5;
static semaforo clientes = new semaforo(0);
static semaforo barbeiros = new semaforo(0);
static semaforo mutex = new semaforo(1);
static int waiting = 0,cont;
static cliente cli[]=new cliente [10];

public Main()
{
}

public static void main(String[] args)
{

barbeiro b1 = new barbeiro(1);
b1.start();
for(cont=0;cont<10;cont++)
cli[cont]=new cliente(cont);

for(cont=0;cont<10;cont++)
cli[cont].start();
}

}


===>>> Barbeiro

package barbeirodorminhoco;

public class barbeiro extends Thread
{
private int id;
public barbeiro(int id)
{
this.id = id;
}
private void cortarCabelo()
{
System.out.println("Barbeiro cortando o cabelo");
try
{
sleep((int)(Math.random() * 1000));
}
catch(Exception e)
{
}
System.out.println("Barbeiro terminando");
}
public void run()
{
System.out.println(" Barbeiro chegou a barbearia");
while (true)
{
Main.clientes.P();
Main.mutex.P();
Main.waiting=Main.waiting+1;
Main.barbeiros.V();
Main.mutex.V();
cortarCabelo();
}
}
}

====>Cliente
package barbeirodorminhoco;

public class cliente extends Thread
{
private int id;
public cliente (int id)
{
this.id = id;
}
private void cortarCabelo()
{
System.out.println("Cliente " + this.id + " cortando o cabelo");
}

public void run()
{
System.out.println("Cliente "+ this.id +" chegou a barbearia");
Main.mutex.P();
if ( Main.waiting < Main.MAXCLIENTES )
{
Main.waiting++;
Main.clientes.V();
Main.mutex.V();
Main.barbeiros.P();
cortarCabelo();
}
else
{
System.out.println("Barbearia Cheia! Cliente " + this.id + " indo embora");
Main.mutex.V();
}
}
}


====>Semaforo
package barbeirodorminhoco;

public class semaforo
{
private int value;
public semaforo(int v)
{
value=v;
}
public synchronized void P()
{
while(value<=0)
{
try
{
wait();
}
catch (Exception e)
{
}
}
value--;
}
public synchronized void V()
{
++value;
notify(); //acorda proccesso
}

}

flw


  


2. Re: Programa Travando

Perfil removido
removido

(usa Nenhuma)

Enviado em 24/04/2008 - 10:29h

Olhando assim tá difícil de dizer o pq. Coloca alguma coisa nos "catch" pra ver se ta dando algum erro.


3. Re: Programa Travando

Gabriela
fla_gab

(usa Ubuntu)

Enviado em 24/04/2008 - 21:14h

não ta ocorrendo nenhum erro,nem exceção, ele faz os 5 cortes que eu defini como sendo o máximo, e depois ele não exceuta mais nada


4. Re: Programa Travando

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2008 - 08:53h

Então em algum momento do código você teria de colocar

Main.waiting--


5. Re: Programa Travando

Gabriela
fla_gab

(usa Ubuntu)

Enviado em 25/04/2008 - 09:29h

renatobach,
já percebi isso e consertei mas me diz uma coisa, como faço para criar objetos de uma classe dentro da própria classe, é possível?

vlw


6. Re: Programa Travando

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2008 - 10:05h

Na programação tudo é possível :D
Se eu entendi a pergunta, você poderia criar um atributo que seria, por exemplo, um List, com objetos da própria classe. Mas isso é um problema bem peculiar, a questão é saber se é a melhor maneira de resolver esse problema.

Ex.:

public class MinhaClasse {
protected List<MinhaClasse> lista;
}


7. Re: Programa Travando

Gabriela
fla_gab

(usa Ubuntu)

Enviado em 25/04/2008 - 12:24h

o que preciso é sempre que não tiver clientes esperando p ser atendido eu criar novos clientes, eu coloquei isso aqui:

barbeiro b1 = new barbeiro(1);
b1.start();
for(cont=0;cont<10;cont++)
cli[cont]=new cliente(cont);

for(cont=0;cont<10;cont++)
cli[cont].start();

e funcionou! tem outra forma melhor?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts