Java - Problema con los semaforos

 
Vista:

Problema con los semaforos

Publicado por Alex (7 intervenciones) el 30/05/2006 18:44:15
Wenas pues resuelta que toy intentado hacer una entrada aun reciento en el cual solo pueden acceder a el 10 hilos a la vez, estar un tiempo variable, vamos un sleep con random, pero tengo un problema a la hora de definir el <<private Semaphore sem = new Semaphore(10);>>, ya que cuando lo ejecuto el <<sem.acquire();>> no se limita a coger solo 10 dejando a los demas a la espera sino q coge los que le da la gana a veces pilla 15 otras veces mas o menos.
No se si es q es algo del jdk de la version q tengo la 1.5.06 o de que sera pero esta haciendo la puñeta, a ver si sabeis por que puede ser os pego aqui el codigo que llevo exo.

Clase Restaurante

import java.util.concurrent.*;

public class Restaurante {
//atributos
private Semaphore sem = new Semaphore(10);

public void entrar(String nombre){
System.out.println("ESPERA "+nombre);
try{
sem.acquire();
System.out.println("ENTRA "+nombre);
Thread.currentThread().getName().wait(3000);
System.out.println("SALE "+nombre);
}catch(InterruptedException e){}
}
}

La clase donde creo los hilos:

class Camiones extends Thread {
private Restaurante rest = new Restaurante();
private String nombre;

public Camiones(String nombre){
super(nombre);
this.nombre = nombre;
start();
}

public void run(){
rest.entrar(nombre);
// yield();
}
}

Y la clase donde los ejecuto:

public class Prueba{

//Constructor del camion
public static void main(String[] args){
for (int i = 1 ; i <= 50; i++)
new Camiones("CAMION "+i);
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con los semaforos

Publicado por Juan (131 intervenciones) el 30/05/2006 18:58:43
Ese semaphore lo hiciste tu o es uno propio de Java?
A mi en parte me suena es porque no le haces new a los 10 objetos, pero nose que el metodo adquire de Semaphore.

Momentaneamente por aqui va un link de la implementacionde un semaforo. pero me suena que esta en eso que te dije antes, la logica de los camiones y el restaurant tiene sentido

http://dis.eafit.edu.co/cursos/st075/Talleres/Taller7/node7.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con los semaforos

Publicado por Alex (7 intervenciones) el 30/05/2006 19:04:30
El metodo semaphore es el que viene implementado en java lo importo con el paquete
import java.util.concurrent.*;

Pero he probado con el binario y da igual xq sigue haciendo lo mismo, mas q nada es q no entiendo como si le doy el valor de 10 para q solo entren 10, me entran mas y ademas no tendria xq salir ya que no les he puesto aun el release.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con los semaforos

Publicado por Juan (131 intervenciones) el 30/05/2006 19:38:00
La clase java.util.concurrent.Semaphore es unaimplementación de los semáforosadquirees como downreleasees como upLos constructores indican valor inicial del contador

Semaphore sem = new Semaphore(CNT_INICIAL);

public Object tomaRecurso() throwsInterruptedException
{
sem.acquire();
return tomaRecursoLibre();
}
public void liberaRecurso(Object x)
{
devuelveRecurso(x);
sem.release()
}

Nunca vi que hicieras un release, claro eso deberia hacer que ningun semaforo se ejecutara porque todos estarian bloqueados en ese momento. Prueba a ver si tiene algo que ver con eso
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con los semaforos

Publicado por Alex (7 intervenciones) el 30/05/2006 19:48:08
Lo del release no lo he puesto xq es una prueba que taba haciendo en el que lo tengo puesto, pasa lo mismo lo unico q salen los procesos xo todos a la vez sin hacer el sleep ni nada, en cuanto a lo de hacer dos metodos no lo vi asi en la explicacion me comentaron hacerlo con unos bloques de try catch para controlar los errores.

http://www.cc.uah.es/lpa/Sesiones/LPA06-Sesion9.htm. Esa es la explicacion que estoy siguiendo.

El codigo completo del acquire y del release es este.

import java.util.concurrent.Semaphore;

public class ColaCamion{
Semaphore semRestaurante1 = new Semaphore(10);
public void esperaEntrar(){
try{
System.out.println("ESPERA "+Thread.currentThread().getName()+" | ");
semRestaurante1.acquire();//WAIT
System.out.println("ENTRA "+Thread.currentThread().getName()+" | ");
}
catch (InterruptedException e){
}
try{
semRestaurante1.release();//SIGNAL
System.out.println("SALE"+Thread.currentThread().getName());
}
catch (Exception e){
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar