Herramientas Concurrentes en JAVA David Jesús Horat Flotats
ÍNDICE 1. Introducción n a Java 2. Herramientas Concurrentes en Java 3. Lectores Escritores (2º) 4. Filósofos comensales 5. Chat usando RMI 6. CORBA
1. Introducción n a Java Desarrollado por Sun Microsystems, salió a la luz en verano de 1995 Java es portable Independencia de la arquitectura y del Sistema Operativo Se compila en un lenguaje intermedio llamado Byte Code Se interpreta por la Java Virtual Machine (JVM) para adaptarlo a la arquitectura y el Sistema Operativo
1. Introducción n a Java Java es orientado a objetos y su sintaxis es muy parecida a C++ No existen: Punteros ni referencias Registros (struct( struct) Definición n de tipos (typedef( typedef) Añade: Recolector de basura (Garbage( Collector)
1. Introducción n a Java Soporta las tres características propias del paradigma de la orientación n a objetos Encapsulación Herencia polimorfismo. Soporta hilos y tiene herramientas de concurrencia Actualmente: Versión n estable: J2SE 1.4.2 Beta 1: J2SE 1.5.0
2. Herramientas Concurrentes 2.1 Introducción n a los hilos 2.2 Synchronized 2.3 Variables condición 2.4 Remote Method Invocation
2.1 Introducción n a los hilos Un hilo o proceso ligero es una unidad básica de ejecución, con su propio: contador de programa (PC) registros de CPU pila (stack( stack) Los hilos dentro de una misma aplicación comparten: código y datos recursos del S.O. (ficheros, E/S, etc.)
2.1 Introducción n a los hilos Clase Thread Encargada de producir hilos para otras clases Define los métodos m start y stop para lanzar y destruir la ejecución n del hilo Define los métodos m suspend y resume para parar y continuar la ejecución n del hilo Nos hace implementar el método m run,, que es el cuerpo del hilo, por donde empieza a ejecutarse una vez lanzado
2.1 Introducción n a los hilos Java no soporta la herencia múltiple m -> > Dificultad en la creación n de hilos - > Solución: Implementar la interfaz Runnable (lo vemos más m s adelante) Interfaz Runnable Nos obliga a implementar el método m run
2.1 Introducción n a los hilos Clase Object Hereda los métodos m que nos permiten usar variables condición n que veremos más s adelante: wait notify notifyall
2.1 Introducción n a los hilos Ciclo de vida de los hilos
2.2 Synchronized Cada objeto dispone de un cerrojo (Lock) Java no provee de instrucciones simples para adquirir y liberar el cerrojo Debemos usar la palabra clave synchronized que veremos a continuación
2.2 Synchronized Métodos sincronizados Todos los métodos m sincronizados de una clase lucharán n por un cerrojo: Si el método m es estático, tico, el cerrojo será el de la clase Si el método m no es estático, tico, el cerrojo será del objeto this,, la instancia de la clase
2.2 Synchronized Bloques de sincronización Para luchar por el cerrojo de un objeto que no es la clase actual, podemos usar: synchronized (objeto) { Código C } El cerrojo por el que luchan en ambos casos es el del objeto
2.3 Variables condición La clase Object (de la que heredan casi todas las clases), nos provee de tres métodos m que actúan an como una variable condición Para ejecutar algún n método m de sincronización n sobre el objeto, el llamante debe poseer su cerrojo
wait () 2.3 Variables condición Provoca que el hilo actual se bloquee a la espera de un notify,, liberando el cerrojo wait (long timeout) Provoca que el hilo actual se bloquee liberando el cerrojo a la espera de un notify o de que pase el tiempo especificado en el parámetro en milisegundos
2.3 Variables condición notify () Despierta un hilo y se pone a luchar por el cerrojo En el caso de haber varios hilos esperando, se despierta a uno aleatoriamente El llamante no libera el cerrojo notifyall () Despierta a todos los hilos y se ponen a luchar por el cerrojo
2.4 Remote Method Invocation 2.4.1 Introducción n a RMI 2.4.2 Uso de interfaces 2.4.3 Configuración n del servidor 2.4.4 Configuración n del cliente
2.4.1 Introducción n a RMI Método de Invocación n Remota Servicios en internet Alternativas: CORBA (estándar independiente) DCOM (Microsoft)
2.4.1 Introducción n a RMI Ventajas: Abstracción n de la interconexión Simplicidad y versatilidad Inconvenientes: Sólo para Java Necesidad de envoltorios para usarse con otro tipo de lenguajes
2.4.2 Uso de interfaces Uso intensivo de Interfaces Enmascaramiento de la implementación del servidor mediante interfaces La interfaz remota debe ser públicap La interfaz remota debe extender la interfaz java.rmi.remote Cada método m de la interfaz remota debe declarar java.rmi.remoteexception
2.4.2 Uso de interfaces Implementar la interfaz remota El servidor debe contener una clase que extienda UnicastRemoteObject e implementar la interfaz remota Dicha clase debe implementar la interfaz remota que vayamos a usar Puede tener métodos m extras, pero el cliente sólo s ve la interfaz El constructor debe declarar RemoteException aunque esté vacío
2.4.3 Configuración n del servidor Para poner en marcha un servicio Crear un gestor de seguridad que soporte RMI RMISecurityManager Usar políticas de java mediante un fichero Crear la instancia del objeto remoto Registrar el objeto remoto para que sea accesible Naming.bind( rmi rmi://pepe/chat )
2.4.3 Configuración n del servidor Configurar el registro (rmiregistry( rmiregistry) Encargado de RMI Se ubica en la IP del ordenador Puerto por defecto: 1099 Lanzar el servicio Windows: start rmiregistry Unix: rmiregistry &
2.4.3 Configuración n del servidor Creación n de stubs y skeleton Necesarios para que RMI funcione Proporcionan las operaciones de red Cualquier objeto remoto debe serializarse Serializan y deserializan Creamos los stubs y skeleton usando el programa rmic usando las clases compiladas
2.4.4 Configuración n del cliente Utilizar el objeto remoto Capturar la interfaz remota del servidor Declaramos una interfaz Buscamos el objeto remoto Pasamos la referencia a nuestra interfaz Ejemplo: ICHatServer server = (IChatServer( IChatServer) java.rmi.naming.lookup(" ("rmi://david/chatserver");
3. Lectores Escritores (2º) 3.1 Descripción 3.2 Planteamiento inicial 3.3 Clase Tiempo 3.4 Implementación n general 3.5 Solución n 1 3.6 Solución n 2
3.1 Descripción Dado un recurso compartido, varios procesos intentarán n acceder a él. Si los procesos desean leerlo, habrá un número n máximo de procesos leyendo el recurso simultáneamente. Sin embargo, si un proceso desea escribir en el recurso, deberá tenerlo en exclusión mútua. Además, si hay escritores en la cola de espera, estos tienen preferencia sobre los lectores.
3.2 Planteamiento inicial Separar los problemas de concurrencia de otros problemas programáticos Dividir los problemas de concurrencia Preprotocolo de lectura (IniLec( IniLec) Postprotocolo de lectura (FinLec( FinLec) Preprotocolo de escritura (IniEsc( IniEsc) Postprotocolo de escritura (FinEsc( FinEsc)
3.3 Clase Tiempo Clase propia para reusar y heredar Métodos long TProg(): Devuelve el tiempo en ms que lleva funcionando el programa long siesta(long): Detiene el hilo durante el tiempo especificado en el parámetro random(int): Devuelve un número n aleatorio entre [0, int)
3.4 Implementación n general Clase LE2 Run: : Lanza lectores y escritores concurrentemente Clases Lector y Escritor Constructor: Se le pasa su identificador, el tiempo máximo m (Tmax( Tmax) ) que usará para dormir o leer y el recurso Run: Duerme durante [0, Tmax] Lee durante [0, Tmax]
3.4 Implementación n general Clase Recurso IniLec(Id): Inicia la lectura de Id FinLec(Id): Finaliza la lectura de Id IniEsc(Id): Inicia la escritura de Id FinEsc(Id): Finaliza la escritura de Id
3.5 Solución n 1 Monitores en Java Métodos sincronizados (cerrojo de la clase) Variable condición n de la clase
3.6 Solución n 2 Monitores en Java Métodos sincronizados para las variables en exclusión Vector de objetos para usar variables condición n independientes y mejorar la eficiencia Cuidado: IniLec e IniEsc no están sincronizados con la clase! Solución: Funciones privadas sincronizadas
4. Filósofos comensales 4.1 Descripción 4.2 Planteamiento inicial 4.3 Implementación n general 4.4 Solución
4.1 Descripción N filósofos, sentados en una mesa redonda disponen de N palillos como se ve en la figura. Si cada filósofo entra en un ciclo infinito en donde piensa durante un tiempo aleatorio y después s come durante otro tiempo aleatorio, conseguir que todos los filósofos coman usando 2 palillos cuando lo necesiten y su espera sea finita.
NFil = 5 4.1 Descripción
4.2 Planteamiento inicial Separar los problemas de concurrencia de otros problemas programáticos Dividir los problemas de concurrencia Métodos propios del problema CogerCubiertos (Id) DejarCubiertos (Id) Funciones privadas para resolver problemas concretos y repetitivos
4.3 Implementación n general Clase FilosofosComensales Lanza todos los filósofos concurrentemente Clase Filosofo Constructor: Se le pasa su identificador, el tiempo máximo m (Tmax( Tmax) ) que usará para pensar o comer y la Mesa Métodos Piensa y Come Run: Piensa durante [0, Tmax] Come durante [0, Tmax]
4.3 Implementación n general Clase Mesa Constructor (NFil( NFil) NFil = Número N de filósofos a la mesa CogerCubiertos (Id) DejarCubiertos (Id)
Monitores en Java 4.4 Solución Métodos sincronizados para las variables en exclusión Vector de objetos para usar variables condición independientes y mejorar la eficiencia Funciones Der (Id): Devuelve el filósofo a la derecha de Id Izq (Id): Devuelve el filósofo a la izquierda de Id Test (Id): Intenta poner a comer al filósofo Id Cuidado: CogerCubiertos no es sincronizado!
5. Chat usando RMI 5.1 Introducción 5.2 Esquemas de flujo de datos 5.3 Control de problemas 5.4 Implementación
5.1 Introducción Aplicación n Cliente - Servidor Servidor -> > Aplicación n Java Modo consola Uso del registro RMI Cliente -> Applet Java Uso de gráficos simples -> > AWT Es posible ponerlo en una página p web
5.2 Esquemas de flujo de datos Cliente Cliente Cliente login (name, chatter) receiveenter (name, chatter) receiveenter (name, chatter) receiveenter (name, chatter) Servidor
5.2 Esquemas de flujo de datos Cliente Cliente Cliente Chat (name, message) receivechat (name, message) receivechat (name, message) receivechat (name, message) Servidor
5.2 Esquemas de flujo de datos Igual para: privatechat -> receivewhisper logout -> receiveexit
5.3 Control de problemas No puede haber dos personas con el mismo nick En caso de desconexión, n, al intentar mandar algo se controla la excepción y se ejecuta un logout No puedes mandar un privado si no has seleccionado a alguien No puedes mandarte un privado a ti mismo
5.4 Implementación 5.4.1 Interfaces remotas Nótese la bidireccionalidad del flujo 5.4.2 Clase UserInfo Diferenciación n entre servidor y cliente para futuras mejoras 5.4.3 Clase ChatServer 5.4.4 Clase ChatClient 5.4.5 Clase ChatApplet