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