Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Java Threads

Hola,
Estoy realizando un parking con java. La barrera es un monitor y hay distintos tipos de hilos: coches o camiones. Cada coche ocupa una plaza de parking y cada camion 2. Cada hilo espera a entrar en el parking hasta que haya sitio y cuando se libera uno o dos espacios entra, esta dentro un rato y luego salen. Controlo si hay plazas coche y si hay plazas camion devolviendo el numero de plaza libre y se mete en el que se ha librado. El problema es que cuando ejecuto con los coches y camiones me sale bien, pero si quiero meter por ejemplo autocarabana de 3 plazas o autobus que ocupa 5 me sale la siguiente exception:
java.lang.ArrayIndexOutOfBoundsException:
se que es que no encuentra sitio en el arreglo, pero creo que lo tengo controlodo con un wait().
Espero alguna respuesta, muchas gracias

noviembre 19, 2013 | Unregistered Commenterkk

Si no existe esa posición en el array, no lo tienes bien controlado.
Sin ver el código no hay manera de saber dónde está el error.

noviembre 19, 2013 | Registered Commenterchoces

Para que necesitas el código, choces. Está claro que re equivocas y lo más seguro es que Java se está confundiendo y no quiere leer la posición del array.
Sin duda es algún bug que ha metido Oracle en el manejo de arreglos que hace Java.

noviembre 19, 2013 | Unregistered CommenterUnoPorAhi

No lo había pensado. Está clarísimo que es una tontería leer ese código :D
¡Con lo fácil que es adivinar!

noviembre 20, 2013 | Registered Commenterchoces

Gracias por responder. Si quereis os mando el código, pero aqui no me deja subirlo...si es un bug como dices como puedo tratarlo?

noviembre 20, 2013 | Unregistered Commenterkk

Puedes usar un debugger para ver cómo cambian las variables que lanzan esa excepción.
Antes de eso, la excepción incluye un stacktrace, donde tiene que aparecer la clase y la línea donde se produce el error.

Como no sé que estructuras de datos estás usando, no veo si la excepción se produce al direccionar directamente un array, o una List con un iterador.

Tampoco veo si la variable de interés es global a todas las tareas paralelas, y en tal caso si está protegida contra problemas de concurrencia entre tareas.

Por eso no puedo determinar si se trata de un problema de concurrencia, o de inicialización de un array, o de iteración de una List, o de todo ello a la vez.

Intenta publicar más información, porque a ciegas es casi imposible echarte una mano.

noviembre 20, 2013 | Registered Commenterchoces

Como os envio el codigo?

noviembre 21, 2013 | Unregistered Commenterkk

Puedes copiar y pegar aquí mismo.
A ser posible, si son varias clases, pega cada clase en un mensaje diferente.

noviembre 21, 2013 | Registered Commenterchoces

CLASE PARKING(MAIN)
package ParkingCamion;

public class Parking {


public static void main(String[] args) {
int N = Integer.parseInt (args[0]);
//Inicializar el parking
Barrera barrera = new Barrera(N);

int C = Integer.parseInt (args[1]);
Coche coches[] = new Coche[C];

for (int i= 0; i < C; i++){
// Seleccionamos ya en qué caja se situará
coches[i]= new Coche(i+1, barrera);
coches[i].start();
}

int Ca = Integer.parseInt (args[2]);
Camion camiones[] = new Camion[Ca];
System.out.println(N);
System.out.println(C);
System.out.println(Ca);

for (int i= 0; i < Ca; i++){
// Seleccionamos ya en que caja se situara
camiones[i]= new Camion(i+100, barrera);
camiones[i].start();
}
try {
for (int i= 0; i < C; i++){
coches[i].join();
}
for (int i= 0; i < Ca; i++){
camiones[i].join();
}
} catch (InterruptedException ex) {
System.out.println("Hilo principal interrumpido.");
}
}
}

noviembre 21, 2013 | Unregistered Commenterkk

CLASE BARRERA:
package ParkingCamion;

public class Barrera {
private int n_plazas;
private int plazas[];
private int libres;
public Barrera(int n){
this.n_plazas=n;
plazas = new int[n];

for(int i=0;i<n_plazas;i++){
plazas[i]=0;
}
libres=n_plazas;
}
private int plazaCamion(){
int plaza = 0;
do {
if ((plazas[plaza] == 0) &&
(plazas[plaza+1] == 0)) {
return plaza;
} else {
plaza++;
}
} while (plaza < n_plazas-1);
return n_plazas;
}
synchronized public int entrada(int coche) throws InterruptedException {
int plaza=0;
imprimir();
// Dejamos un hueco para asegurar que pueden
// entrar los camiones
while (libres <= 1) {
System.out.println("Coche " + coche + "esperando");
wait();
}
while (plazas[plaza] != 0) {
plaza++;
}
plazas[plaza] = coche;
libres--;
return plaza;
}
synchronized public int entrada_camion(int camion)throws InterruptedException {
int plaza=0;
imprimir();
// Mientras no haya plaza
while ((plaza = plazaCamion()) == n_plazas) {
System.out.println("Camion " + camion + "esperando");
wait();
}
plazas[plaza] = camion;
plazas[plaza+1] = camion;
libres -= 2;
return plaza;
}

synchronized public void salida(int plaza) {
plazas[plaza] = 0;
libres++;
notify();
}
synchronized public void salida_camion(int plaza) {
plazas[plaza] = 0;
plazas[plaza+1] = 0;
libres += 2;
notify();
notify();
}
public void imprimir() {
System.out.print("Parking: ");
for (int i=0; i<n_plazas; i++) {
System.out.print("[" + plazas[i] + "] ");
}
System.out.println("");
}

}

noviembre 21, 2013 | Unregistered Commenterkk

CLASE COCHE
package ParkingCamion;

import java.util.Random;


class Coche extends Thread {
private static final int MAX_DELAY = 2000;
private int id;
private Barrera barrera;
Coche (int id, Barrera bar) {
this.id = id;
this.barrera = bar;
}
public void run() {
try {
Thread.sleep(new Random().nextInt(MAX_DELAY));
System.out.println("Coche " + id + " intenta entrar en parking");
int plaza = barrera.entrada(id);
System.out.println("Coche " + id + " aparcadoen " + plaza);
barrera.imprimir();
Thread.sleep(new Random().nextInt(MAX_DELAY));
barrera.salida(plaza);
System.out.println("Coche " + id +" saliendo");
barrera.imprimir();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

noviembre 21, 2013 | Unregistered Commenterkk

CLASE CAMION
package ParkingCamion;

import java.util.Random;

public class Camion extends Thread {
private static final int MAX_DELAY = 2000;
private int id;
private Barrera barrera;
Camion (int id, Barrera bar) {
this.id = id;
this.barrera = bar;
}
public void run() {
try {
Thread.sleep(new Random().nextInt(MAX_DELAY));
System.out.println("Camion " + id + " intenta entrar en parking");
int plaza = barrera.entrada_camion(id);
System.out.println("Camion " + id + "aparcado en plazas " + plaza + " y " + (plaza+1));
barrera.imprimir();
Thread.sleep(new Random().nextInt(MAX_DELAY));
barrera.salida_camion(plaza);
System.out.println("Camion " + id + "saliendo");
barrera.imprimir();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

noviembre 21, 2013 | Unregistered Commenterkk

Las clases que has publicado son las dices que te funcionan bien.
Las que te dan errores son otras dos, auto caravana y autobús, que no has publicado.

noviembre 21, 2013 | Registered Commenterchoces

Seria agregar estos dos metodos en la clase barrera y declarar como camion por ejemplo autocarabana. Este codigo es con 3, pero con 5 seria lo mismo
synchronized public int entrada_beta(int camion) throws InterruptedException{
int plaza=0;
imprimir();
while((plaza=plazaBt())==n_plazas){
System.out.println("Bezero taldea"+camion+"etxoiten");
wait();
}
plazas[plaza]=camion;
plazas[plaza+1]=camion;
plazas[plaza+2]=camion;
libres -=3;
return plaza;
}
public int plazaBt(){
int plaza=0;
do{
if((plazas[plaza]==0)&&(plazas[plaza+1]==0)&&(plazas[plaza+2]==0)){
return plaza;
}else{
plaza++;
}
}while(plaza<n_plazas-1);
return n_plazas;
}

synchronized public void salida_beta(int plaza){
plazas[plaza]=0;
plazas[plaza+1]=0;
plazas[plaza+2]=0;
libres +=3;
notify();
notify();
notify();
}

noviembre 21, 2013 | Unregistered Commenterkk

Y cuando ejecuto este codigo o con 5 me sale
java.lang.ArrayIndexOutOfBoundsException:

noviembre 21, 2013 | Unregistered Commenterkk