Vous êtes sur la page 1sur 14

Ejemplo: Un mundo virtual

Múltiples humanoides virtuales se mueven en un


escenario.
Un escenario consta de varias habitaciones.
En las habitaciones hay objetos (cosas) que los
humanoides pueden ver y coger.
Los humanoides se desplazan por la habitación
observando, cogiendo cosas y dejando cosas.
Los humanoides pueden tener un hilo de ejecución
independiente.
Los humanoides dentro de la misma habitación
interaccionan cogiendo y dejando objetos en la
habitación.
Lenguajes de Programación - Progr. Concurrente 30
Ejemplo: Un mundo virtual (2)

C C
C

C C
C

Lenguajes de Programación - Progr. Concurrente 31


Ejemplo: Diagrama UML del problema

Habitacion VectorCosas
Escenario
* 1
colocar (Cosa)() extraer()
getHabitacion() guardar
ret irar()
1 verHabit acion() (Cosa)() most
1 rar()
1
se mueve por

está ubicado en

* *

* Actor Cosa
juego
situarEn() putNombre (String)()
main() * run() getNombre()
navegar() MayorQue (Cosa)()
t oS tring()

Lenguajes de Programación - Progr. Concurrente 32


Clase juego
public class juego {

public static void main (String[] args) {

final int N_HAB = 1; ƒƒhabitaciones del escenario


final int N_ACT = 2; ƒƒactores en el escenario

Escenario e = new Escenario(N_HAB);


Actor[] agente = new Actor[N_ACT];

for (int i=O; i<N_ACT; i++) {


agente[i] = new Actor(e,"Agente " + i);
agente[i].situarEn((int)( Math.random() * N_HAB ));
agente[i].start();
}

Lenguajes de Programación - Progr. Concurrente 33


Clase Escenario
class Escenario {

private Habitacion [] elementos; ƒƒhabitaciones del escenario


private static final int n_cosas = 1O; ƒƒnum. cosas en la habitacion

public Escenario (int num) {


elementos = new Habitacion[num];
for (int i=O; i< num; i++)
elementos[i] = new Habitacion(n_cosas);
}

public Habitacion getHabitacion (int ind) {


return elementos[ind];
}

Lenguajes de Programación - Progr. Concurrente 34


Clase Habitacion
class Habitacion {

private VectorCosas contenido; ƒƒcontenedor de cosas


private int numCosa; ƒƒpara identificar las cosas

public Habitacion (int n_cosas) {


int pos;

this.numCosa = O;
this.contenido = new VectorCosas();
for (int i=O; i<n_cosas; i++) {
pos = (int)( Math.random() * 1OO.O );
this.colocar ( new Cosa(pos, pos, pos), "" );
}
}

public void colocar (Cosa c, String q){


this.numCosa ++;
c.putNombre (this.numCosa);
this.contenido.guardar (c, q);
}

Lenguajes de Programación - Progr. Concurrente 35


Clase Habitacion (2)
public void retirar (String q){
this.contenido.extraer(q);
}

public void verHabitacion (String q) {


this.contenido.mostrar(q);
}

}ƒƒfin Habitacion

Lenguajes de Programación - Progr. Concurrente 36


Clase VectorCosas
class VectorCosas {

private static final int MAX = 1OO;


private int tam;
private Cosa[] lista;

public VectorCosas () {
lista = new Cosa [MAX];
tam = O;
}

public synchronized void mostrar (String quien) {


int p = O;

System.out.println (quien + " ve (" + tam + "):" );


for (int i=O; i<tam; i++)
System.out.println(" " + quien + ", " + lista[i] );
}

Lenguajes de Programación - Progr. Concurrente 37


Clase VectorCosas (2)
public synchronized void guardar (Cosa c, String quien) {
boolean encontrado = false;
int p = O;

try {
while (tam == MAX ) {ƒƒpuedo almacenar?
System.out.println (quien + " espera poder colocar Cosa.");
wait();
}
System.out.println(quien + " coloca C" + c.getNombre());
while ( (p < tam) && (! encontrado) ) {ƒƒalmaceno ordenado
if ( lista[p].mayorQue(c) ) encontrado = true;
else p++;
}
if ( ! encontrado )
lista[tam] = c;
else {
for (int i=tam-1; i>=p; i--)
lista[i+1] = lista [i];
lista[p] = c;
}
tam++;
notifyAll(); ƒƒya esta, notifico.
}
catch (InterruptedException e) {}
}
Lenguajes de Programación - Progr. Concurrente 38
Clase VectorCosas (3)
public synchronized void extraer (String quien) {
int eleccion = (int) ( Math.random() * tam );

try {
ƒƒpuedo extraer?
while ( tam == O ) {
System.out.println (quien + " espera poder eliminar Cosa.");
wait();
}
ƒƒelimino "eleccion"
System.out.println(quien + " elimina C" + lista[eleccion].getNombre());
for (int i=eleccion + 1; i<tam; i++)
lista[i-1] = lista[i];
tam--;
ƒƒya esta, notifico.
notifyAll();
}
catch (InterruptedException e) {}
}

}ƒƒfin ListaCosas

Lenguajes de Programación - Progr. Concurrente 39


Clase Cosa
class Cosa {

private int x, y, z; ƒƒposicion 3D


private int nom; ƒƒidentificador de cada objeto

public Cosa () {
this (O, O, O);
}

public Cosa (int a, int b, int c) {


this.x = a;
this.y = b;
this.z = c;
}

public void putNombre (int n) {


this.nom = n;
}

Lenguajes de Programación - Progr. Concurrente 40


Clase Cosa (2)
public boolean mayorQue ( Cosa c ){
boolean mayor = false;

if ( this.x > c.x ) mayor = true;


else if ( this.y > c.y ) mayor = true;
else if ( this.z > c.z ) mayor = true;
return mayor;
}

public String toString () {


String str;

str = "C" + this.nom + " (" + this.x + ", " + this.y + ", "
+ this.z + ")";
return str;
}

}ƒƒfin Cosa

Lenguajes de Programación - Progr. Concurrente 41


Clase Actor
class Actor extends Thread {
private Escenario mundo; ƒƒescenario en el que se mueve
private Habitacion donde; ƒƒhabitacion en la que esta
private String nombre; ƒƒidentificador

public Actor (Escenario e, String nom){


this.mundo = e;
this.nombre = nom;
this.situarEn(O);
}

public void situarEn (int h){


this.donde = this.mundo.getHabitacion(h);
}

private void navegar() {


try {
sleep ((long) (Math.random() * 1OO.O));
}
catch (InterruptedException e) {}
}

Lenguajes de Programación - Progr. Concurrente 42


Clase Actor (2)
public void run () {
int pos;
int veces = O, cuantos;
final int LIM = 3;

while ( veces < LIM ) {


this.donde.verHabitacion (nombre); ƒƒobservar
this.navegar(); ƒƒmoverse
cuantos = (int) (Math.random() * 3);
for (int i=O; i<cuantos; i++)
this.donde.retirar(nombre);
this.navegar();
cuantos = (int) (Math.random() * 3);
for (int i=O; i<cuantos; i++) {
pos = (int) (Math.random()*1OO.O);
this.donde.colocar( new Cosa (pos, pos, pos), nombre );
}
System.out.println("fin ciclo de " + nombre);
veces++;
}
}
}ƒƒfin Actor
Lenguajes de Programación - Progr. Concurrente 43