Académique Documents
Professionnel Documents
Culture Documents
RMI Y THREADS
1. Introduccin a RMI .................................................................................... 1
1.1. Caractersticas de RMI ...................................................................................................................................1
1.2. Pasos para desarrollar una aplicacin RMI....................................................................................................2
2. Aplicacin RMI paso a paso ....................................................................... 2
2.1. Definicin de la interfaz para comunicarse con el objeto remoto ...................................................................2
2.2. Implementacin de la interfaz remota ............................................................................................................2
2.3. Implementacin del servidor de objetos remotos ...........................................................................................2
2.4. Implementacin del cliente .............................................................................................................................3
2.5. Generacin de Stubs y Skeletons ..................................................................................................................4
3. Ejecucin de una aplicacin RMI ............................................................... 4
3.1. Pasos para la ejecucin de la aplicacin RMI ................................................................................................4
4. Threads....................................................................................................... 5
4.1. Introduccin a Threads...................................................................................................................................5
4.2. Formas de crear threads de ejecucin: ..........................................................................................................5
Ejemplo heredando de thread.............................................................................................................................. 6
Ejemplo implementando la interfaz Runnable ..................................................................................................... 6
4.3. Sincronizacin ................................................................................................................................................6
Acceso a datos compartidos................................................................................................................................ 6
Ejemplo de sincronizacin ................................................................................................................................... 7
5. Ampliacin de la prctica .......................................................................... 8
1. Introduccin a RMI
1 de 1
1.2. Pasos para desarrollar una aplicacin RMI
1. Definir una interfaz con los servicios que ofrece el objeto remoto. Se define una interfaz
para especificar la forma en que se va a llevar a cabo la comunicacin entre
componentes. La interfaz definir los mtodos que se podrn invocar de forma remota.
2. Construir una clase que implementa la interfaz definida en el paso 1.
3. Escribir la aplicacin servidora que se encargar de instanciar y registrar los objetos que
se invocarn de forma remota.
4. Construir el cliente que debe localizar y utilizar el objeto remoto.
5. Compilar las clases con el compilador de java (javac).
6. Ejecutar el compilador de RMI (rmic) para generar las clases de soporte (stubs y
skeletons).
2 de 2
ms avanzados deben ser capaces de instanciar objetos remotos bajo demanda y
mantenerlos o destruirlos segn su tiempo de utilizacin.
Nuestro servidor se llamar EcoServer, y es muy sencillo. Se encargar de crear un objeto de
la clase que implementa la interfaz remota, luego registra este objeto en un servidor de
nombres (que en el caso de Java ser el rmiregistry). A travs de este servidor de nombres los
clientes conocern el nombre con el cual se encuentra publicado el objeto remoto y lo
utilizarn para obtener referencias al mismo y ejecutar sus mtodos.
import java.rmi.*;
class EcoServer
{
public static
static void main(String args[]) throws Exception
{
EcoImpl ref = new EcoImpl();
// Registrar el objeto remoto en el servidor de nombres,
// asocindolo a un nombre que ser utilizado desde el cliente
Naming.rebind("Eco", ref);
import java.rmi.*;
3 de 3
2.5. Generacin de Stubs y Skeletons
Es necesario para la ejecucin generar un stub y un skeleton para la clase que implementa la
interfaz remota. El stub generado jugar el papel de proxy en el cliente, de manera que ste se
comunicar con el stub como si estuviera comunicndose con el objeto en local. Ser el stub
el encargado de enviar las peticiones de invocacin de mtodos y parmetros y luego de
devolver el valor de retorno al cliente. El stub no se comunica directamente con el servidor
remoto, sino con un skeleton que es el que lee los parmetros del mtodo y se encarga de
invocarlo, y enviar el valor de retorno del mismo de regreso al stub.
Para generar el stub y el skeleton de la clase que implementa la interfaz remota (EcoImpl) se
utiliza el compilador de RMI rmic. Lo que se le pasa como argumento es el fichero con
extensin .class. La sintaxis es:
Utilizamos la opcin vcompat para que se generen un stub y un skeleton compatibles con la
versin 1.1 y 1.2, ya que la opcin por defecto slo generara el stub. Esto provocar que se
generen, adems de los .class que ya existan, el stub y el skeleton, es decir:
Eco.class
EcoImpl.class
EcoImpl_Skel.class
EcoImpl_Stub.class
EcoServer.class
EcoClient.class
Windows:
start rmiregistry
Linux:
rmiregistry &
4 de 4
java EcoServer
Servidor de Objetos
4. Threads
5 de 5
Ejemplo heredando de thread
La primera forma (heredar de la clase Thread) se muestra a continuacin:
4.3. Sincronizacin
Acceso a datos compartidos
Cuando varios hilos acceden a los mismos datos, es decir, tienen datos compartidos, podemos
tener problemas. Por ejemplo, si tengo una pila y dos hilos accediendo a ella, puede haber
inconsistencia con los datos.
Este problema se resuelve en java con el modificador synchronized aplicndolo a cada
mtodo (push y pop). De esta forma se garantiza que hasta que no se termine de ejecutar el
mtodo sincronizado, no se le da el control a otro hilo. Para esto se chequea un flag de
bloqueo que se activa cuando se entra en un mtodo sincronizado y slo se libera si el mtodo
ha terminado.
6 de 6
En java cada objeto tiene asociado un flag de bloqueo. La palabra clave synchronized
permite la interaccin con este flag, garantizando el acceso exclusivo al cdigo que afecta a
los datos compartidos.
Todos los accesos a datos compartidos deben estar sincronizados. Los datos protegidos por
synchronized deben ser privados.
Ejemplo de sincronizacin
A continuacin mostramos un ejemplo de dos hilos que acceden a un objeto de la clase Pila.
Un hilo se encarga de llamar al mtodo push (HiloInsertar) y otro llama al mtodo pop
(HiloExtraer). Como ambos utilizan la mima pila, es necesario crear una clase Pila con sus
mtodos push y pop sincronizados.
import java.lang.*;
class Pila
{
private char [] datos = new char [10];
private int cima = 0;
7 de 7
i++;
if (i>=10) i=1;
p.push(Character.forDigit(i,10));
try
{
Thread.sleep(1000);
}
catch (InterruptedException e) {}
}
}
}
public class PruebaPila
{
public static void main (String args[])
{
Pila p = new Pila();
HiloInsertar h1 = new HiloInsertar(p);
h1.start();
HiloInsertar h2 = new HiloInsertar(p);
h2.start();
HiloInsertar h3 = new HiloInsertar(p);
h3.start();
HiloInsertar h4 = new HiloInsertar(p);
h4.start();
HiloExtraer h5 = new HiloExtraer(p);
h5.start();
HiloExtraer h6 = new HiloExtraer(p);
h6.start();
HiloExtraer h7 = new HiloExtraer(p);
h7.start();
HiloExtraer h8 = new HiloExtraer(p);
h8.start();
}
}
5. Ampliacin de la prctica
Para completar la prctica se debe desarrollar por parte de los alumnos una aplicacin
completa de RMI (servidor y cliente) partiendo de la clase Jugador que mostramos a
continuacin y que representar el tipo del objeto que ser retornado por el mtodo de la
interfaz remota ServicioJugador. Para desarrollar la aplicacin RMI completa, habr que
implementar las clases ServicioJugadorImpl (clase que implementa la interfaz remota),
ServicioJugadorServer (clase servidora de objetos remotos) y ServicioJugadorCliente
(clase cliente del objeto remoto). Para la implementacin y la ejecucin, debe guiarse por los
pasos descritos anteriormente en la prctica.
Clase Jugador
// Clase que define los datos de tipo jugador
// tiene que ser serializable pues sus objetos
// sern retornados por un mtodo remoto
import java.io.*;
public class Jugador implements
implements Serializable{
String nombre;
String apellido;
private Integer edad;
public Jugador(String nom, String ape, Integer edad)
{
nombre = nom;
apellido = ape;
this.edad
this = edad;
}
8 de 8
this.edad
this = edad;
}
9 de 9