Está en la página 1de 37

Implementación de

Sistemas en Tiempo
Real en Java
Declaración de Interfaces
Una interfaz es un mecanismo para definir un contrato entre dos partes: el proveedor de un
servicio y las clases que necesitan que sus objetos usen el servicio.
 una interfaz es una clase abstracta, un grupo relacionado de métodos con cuerpo vacío.
Para declarar una interfaz se deben proporcionar las cabeceras de los métodos.
Implementación de Interfaces
Para acceder a los métodos de la interfaz, la interfaz tiene que ser implementada por otra
clase usando la palabra clave interface.
Ejemplo de Uso de una Interfaz
Procesos vs Hilos
Un Sistema Operativo asigna recursos necesarios
(memoria, tiempo procesamiento, entrada/salida)
a los procesos y asegura que no se interfieran entre
si. La mayoria de los SO distingue entre:
Procesos pesados: completamente separados entre
si.
Proceso livianos (Hilos): comparten un espacio de
memoria y posiblemente otros recursos.

Un hilo es un segmento de código capaz de ejecutarse con otros procesos. Los hilos no se
ejecutan al mismo tiempo sino que emplean tiempo compartido. Es necesario que un hilo de a
otros hilos la posibilidad de ejecutarse.
Procesos vs Hilos
Computación Concurrente
Un lenguaje de programación concurrente debe permitir:
Crear de hilos
Compartir datos entre hilos
Sincronizar el orden de ejecución de los hilos
 Sincronizar la competencia: cuando varios hilos comparten un mismo recurso.
 Sincronizar la cooperación: cuando un hilo espera la finalización de ejecución de otro
proceso antes de iniciar su ejecución.
Implementación de hilos en Java
Heredando de la clase java.lang.Thread
◦ Java.lang.Thread implementa la clase Runnable
◦ La clase que hereda de Thread hereda todos los métodos y puede sobre escribirlos
◦ Esta opción puede ser seleccionada cuando la clase que necesita ser concurrente no
hereda de otras clases.
Implementando la interfaz Runnable.
◦ Para implementar la interfaz Runnable es necesario implementar el método run()
◦ Esta opción se selecciona cuando la clase que se requiere que sea concurrente hereda de
otras clases.
Implementación de hilos en Java
Método 1: hilo como subclase de Thread Método 2: hilo que implementa Runnable
Class A extends Thread { class B implements Runnable {

A ( ) {...} // Constructor B ( ) { ...} // Constructor


...
...
public void run() {
public void run ( ) { ... // Acciones del Thread
... // Acciones que del Thread }
} }
}
B p = new B( );
A p1 = new A( ); // Creación del Thread p2 = new Thread(p);
thread p1 ...
p1.start(); // Se inicia el p2.start(); // Se inicia el thread
thread y se ejecuta p1.run() y se ejecuta p2.run()
Implementación de hilos en Java
Thread Class Runnable Interface
Fundamento Cada Thread crea un objeto y se Múltiples Threads comparten el mismo
asocia con el objeto objeto
Memoria Dado que cada Thread crea su Dado que múltiples Threads comparten
propio objeto, se necesita más un mismo objeto, se necesita menos
memoria memoria
Uso El usuario tiene que extender la Es la mejor opción si solo se desea
clase Thread solo si quiere especializar el método run
sobreescribir los métodos de la clase

Acoplamiento El extender la clase Thread El implementar la interface Runnable


introduce acoplamiento ajustado acoplamiento débil ya que el código del
dado que la clase contiene el código Thread está separado del trabajo de los
de la clase Thread y el trabajo Threads
asignado al Thread
Ejercicio 1
Implemente un hilo denominado Mythread usando la clase Thread.
El constructor de Mythread debe imprimir el mensaje "Thread creado...."
El método run de Mythread debe imprimir 10 veces el mensaje "Thread Hijo ..."
Ejercicio 2
Implemente un hilo denominado Runnablethread que implemente la interfaz Runnable.
El constructor de Runnablethread debe imprimir el mensaje " Runnablethread creado...."
El método run de Runnablethread debe imprimir 10 veces el mensaje "Thread Runnable
hijo..."
Tipos de hilos
Hilos de usuario. La actividad del hilo está restringida
en el tiempo.
Hilos demonio. Los hilos se ejecutan en background
mientras el programa principal se ejecuta.
setDaemon(boolean): indica que el hilo es de tipo
demonio.
Se debe usar antes de start.
 Es recomendable en el constructor del hilo.

isDaemon(): averigua el tipo de un hilo.


Ejercicio 3
Implemente un hilo denomido Clock usando la clase Thread. El método run debe
mostrar el mensaje "tic" y luego pausar la ejecución del hilo durante 300 milisegundos.
Cambie la categoría del hilo Clock a Deamon y vuelva a ejecutar el código creado en el
paso anterior.

Para pausar la ejecución del hilo puede utilizar Thread.sleep (cant. milisegundos)
Ciclo de vida de los hilos
Control de hilos a nivel grupo
java.lang.ThreadGroup
Permite ejecutar hilos simultáneamente y controlarlos como una única entidad.
La clase The class ThreadGroup tiene dos constructores:
– ThreadGroup (String name);
– ThreadGroup (ThreadGroup parent, String name).
Prioridad entre hilos
El método setPriority permite establecer el nivel de prioridad de un hilo.
El valor de prioridad debe encontrarse entre un valor mínimo (MIN_PRIORITY) y un valor
máximo (MAX_PRIORITY).
◦ MIN_PRIORITY = 1
◦ NORM_PRIORITY = 5
◦ MAX_PRIORITY = 10
getPriority permite conocer la prioridad de un hilo.
Programación de tareas
Se debe heredar de la clase java.util.TimerTask que implementa la interfaz Runnable.
◦ Implementar el método run() a fin de definir la tarea a ser realizada.
Emplear un java.util.Timer que permita la ejecución de la tarea.
◦ schedule(task, long milliseconds): programa la tarea al especificar un delay inicial.
◦ Schedule(task, long milliseconds, long period): programa la tarea después de un delay
inicial para ejecutarse de manera periódica.
◦ El método cancel() detiene la programación del Timer.
Ejercicio 4
Implemente un hilo denomido Clock usando la clase Thread. El método run debe
mostrar el mensaje "tic“.
El hilo Clock debe planificarse para ejecutarse con una demora inicial de 4000
milisegundos.

Para planificar la tarea se usa el método schedule(task, long milliseconds)


Ejercicio 5
Implemente un hilo denomido Clock usando la clase Thread. El método run debe
mostrar el mensaje "tic“.
El hilo Clock debe planificarse para ejecutarse con una demora inicial de 4000
milisegundos y un periodo de 5000 milisegundos.

Para planificar ejecución periodica de una tarea se usa el método Schedule(task,


long milliseconds, long period):
Sincronización
Orden de ejecución de los hilos
Implementación de regiones críticas
Acceso concurrente a variables compartidas
Sincronización entre hilos
Sincronización del orden de ejecución de
los hilos
Para sincronizar el orden de ejecución de los hilos se usa el método join().
El código que se encuentra después del join() se ejecuta al finalizar la ejecución del código
localizado antes del join().
Implementación de regiones críticas
Región Crítica: una secuencia de instrucciones que debe aparecer que se ejecuta
indivisiblemente. La sincronización que protege una región critica se como como exclusión
mutua.
Synchronized: define una exclusión mutua para un método. Como máximo un hilo puede
ejecutar el método a la vez.

Recurso Compartido
Ejemplo método en exclusión mutua
Acceso concurrente a variables
compartidas
La variable debe ser implementada como objeto
La palabra clave synchronized define un bloque que se ejecuta exclusivamente.
Acceso concurrente a métodos y
variables
Un monitor supervisa que solo un thread ejecute el bloque de instrucciones.
synchronized void Metodo(){ ....}: monitor asociado con el método.
 synchronized (objecto) { instrucciones }: monitor asociado con el objeto. Cada objecto tiene
una cola de espera.

 La sincronización provoca que la ejecución sea más lenta.


 Se tiene que limitar el número de porciones de código sincronizadas y su tamaño.
Sincronización entre hilos
Se emplean los métodos wait(), notify() y notifyAll().
Estos métodos son definidos por la clase java.lang.Object
El método wait() bloquea la ejecución de un hilo hasta que se cumpla una condición. El
cumplimiento de la condición es señalado por otro hilo mediante los métodos notify() o
notifyAll().
Cuando el método wait() se invoca desde un método synchronized, la ejecución del hilo es
pausada y se libera el bloqueo que el hilo tiene sobre el método. Cuando condición se cumpla, el
hilo se reanuda y debe esperar para tomar nuevamente la ejecución exclusiva del método.
Sincronización entre hilos.
Ejemplo de comunicación asíncrona
Ejercicio 6

Un profesor de literatura enseña nuevas palabras a sus alumnos.


Los alumnos tienen que escribir tres veces en el pizarron cada
nueva palabra.
Sincronización entre hilos.
Sincronización entre hilos
Sincronización entre hilos (sleep vs wait)
Sleep bloquea la ejecución pero el hilo mantiene el bloqueo (termina su ejecución).
Wait bloquea la ejecución pero el hilo libera el bloqueo (un Segundo hilo puede ejecutar la
sección critica).
Sincronización entre hilos (notify vs
notifyall)
notify(): despierta un thread a la vez pero sin especificar el thread. El controlador
selecciona el hilo a despertar (no usa un mecanismo FIFO).
Notifyall(): despierta a todos los hilos que realizaron un wait().
Ejercicio 7
¿Qué sucede si en el código del docente de literatura s reemplazamos notifyall() por
notify()?
Semáforos
Un semáforo es un objeto de alto nivel que ayuda a administrar el acceso concurrente a un
recurso compartido, el cual acepta a lo sumo N accesos concurrentes.
Un semáforo contiene dos operaciones atómicas que incrementan y decrementan una
variable. Estas operaciones son conocidas como P y V.
La operación P decrementa la variable, y en caso de que la variable se haga negativa coloca
en espera al hilo que convocó a la operación P.
La operación V incrementa la variable, en caso de que la variable sea menor o igual a cero se
ejecuta un notify.
Semáforos Implementación
Ejemplo Empleo del Semáforo

También podría gustarte