Download Presentación Java
Document related concepts
no text concepts found
Transcript
Herramientas Concurrentes en JAVA David Jesús Horat Flotats ÍNDICE 1. Introducció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 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 a Java Java es orientado a objetos y su sintaxis es muy parecida a C++ – No existen: Punteros ni referencias Registros (struct) Definición de tipos (typedef) – Añade: Recolector de basura (Garbage Collector) 1. Introducción a Java Soporta las tres características propias del paradigma de la orientación a objetos – Encapsulación – Herencia – polimorfismo. Soporta hilos y tiene herramientas de concurrencia Actualmente: – Versión estable: J2SE 1.4.2 – Beta 1: J2SE 1.5.0 2. Herramientas Concurrentes 2.1 2.2 2.3 2.4 Introducción a los hilos Synchronized Variables condición Remote Method Invocation 2.1 Introducció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) 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 a los hilos Clase Thread – Encargada de producir hilos para otras clases – Define los métodos start y stop para lanzar y destruir la ejecución del hilo – Define los métodos suspend y resume para parar y continuar la ejecución del hilo – Nos hace implementar el método run, que es el cuerpo del hilo, por donde empieza a ejecutarse una vez lanzado 2.1 Introducción a los hilos Java no soporta la herencia múltiple -> Dificultad en la creación de hilos > Solución: Implementar la interfaz Runnable (lo vemos más adelante) Interfaz Runnable – Nos obliga a implementar el método run 2.1 Introducción a los hilos Clase Object – Hereda los métodos que nos permiten usar variables condición que veremos más adelante: wait notify notifyAll 2.1 Introducció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 sincronizados de una clase lucharán por un cerrojo: Si el método es estático, el cerrojo será el de la clase Si el método no es está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 } 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 que actúan como una variable condición Para ejecutar algún método de sincronización sobre el objeto, el llamante debe poseer su cerrojo 2.3 Variables condición wait () – 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 2.4.2 2.4.3 2.4.4 Introducción a RMI Uso de interfaces Configuración del servidor Configuración del cliente 2.4.1 Introducción a RMI Método de Invocación Remota Servicios en internet Alternativas: – CORBA (estándar independiente) – DCOM (Microsoft) 2.4.1 Introducción a RMI Ventajas: – Abstracció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ública – La interfaz remota debe extender la interfaz java.rmi.Remote – Cada método 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 extras, pero el cliente sólo ve la interfaz – El constructor debe declarar RemoteException aunque esté vacío 2.4.3 Configuració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://pepe/Chat”) 2.4.3 Configuración del servidor Configurar el registro (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 del servidor Creació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 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) java.rmi.Naming.lookup("rmi://david/ChatServer"); 3. Lectores – Escritores (2º) 3.1 3.2 3.3 3.4 3.5 3.6 Descripción Planteamiento inicial Clase Tiempo Implementación general Solución 1 Solución 2 3.1 Descripción Dado un recurso compartido, varios procesos intentarán acceder a él. Si los procesos desean leerlo, habrá un número 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) – Postprotocolo de lectura (FinLec) – Preprotocolo de escritura (IniEsc) – Postprotocolo de escritura (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 aleatorio entre [0, int) 3.4 Implementación general Clase LE2 – Run: Lanza lectores y escritores concurrentemente Clases Lector y Escritor – Constructor: Se le pasa su identificador, el tiempo máximo (Tmax) que usará para dormir o leer y el recurso – Run: Duerme durante [0, Tmax] Lee durante [0, Tmax] 3.4 Implementació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 1 Monitores en Java – Métodos sincronizados (cerrojo de la clase) – Variable condición de la clase 3.6 Solución 2 Monitores en Java – Métodos sincronizados para las variables en exclusión – Vector de objetos para usar variables condició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 4.2 4.3 4.4 Descripción Planteamiento inicial Implementación general 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 come durante otro tiempo aleatorio, conseguir que todos los filósofos coman usando 2 palillos cuando lo necesiten y su espera sea finita. 4.1 Descripción NFil = 5 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 general Clase FilosofosComensales – Lanza todos los filósofos concurrentemente Clase Filosofo – Constructor: Se le pasa su identificador, el tiempo máximo (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 general Clase Mesa – Constructor (NFil) NFil = Número de filósofos a la mesa – CogerCubiertos (Id) – DejarCubiertos (Id) 4.4 Solución Monitores en Java – 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 5.2 5.3 5.4 Introducción Esquemas de flujo de datos Control de problemas Implementación 5.1 Introducción Aplicación Cliente - Servidor – Servidor -> Aplicación Java Modo consola Uso del registro RMI – Cliente -> Applet Java Uso de gráficos simples -> AWT Es posible ponerlo en una página web 5.2 Esquemas de flujo de datos Cliente Cliente Cliente login (name, chatter) receiveEnter (name, chatter) r) e t t a h ,c e m a n ( r) r e e t t n t a eE h c receiv e, m na ( r te n E ve i e rec Servidor 5.2 Esquemas de flujo de datos Cliente Cliente Cliente Chat (name, message) receiveChat (name, message) ) e g a s es m , e ) m a e n ( g t ha sa C s e v e i rece ,m e m a n ( t a h C e iv e c re 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, 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 entre servidor y cliente para futuras mejoras 5.4.3 Clase ChatServer 5.4.4 Clase ChatClient 5.4.5 Clase ChatApplet