Está en la página 1de 30

Federico Peinado www.federicopeinado.

es
Depto. de Ingeniera del Software e Inteligencia Artificial disia.fdi.ucm.es
Facultad de Informtica www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es

La ejecucin de tareas en paralelo optimiza la utilizacin de los recursos del sistema


Ejemplo: cuando un proceso est esperando la finalizacin

Las mquinas actuales pueden ejecutar varios programas simultneamente

de una operacin de E/S, otros procesos pueden aprovechar el procesador del sistema que en ese momento no se usa

En teora: slo tantos como procesadores (ncleos) tengan En la prctica: intercalando la ejecucin de varios procesos,

La programacin paralela/concurrente es mucho ms compleja que la convencional


Laboratorio de Programacin de Sistemas Hilos y sincronizacin

cambiando muy rpido entre ellos, parece como si se ejecutaran simultneamente (programacin concurrente)

Son las unidades bsicas de ejecucin de la programacin concurrente Procesos


Hilos (threads, tambin llamados hebras)
Disponen de su propio espacio de memoria Se pueden comunicar a travs de pipes y sockets Ejecuciones simultneas dentro de un mismo proceso (podemos

Java pone ms nfasis en los hilos que en los procesos


La propia mquina virtual de Java es un nico proceso con

considerarlos como procesos ligeros) Su espacio de memoria es, por tanto, compartido

mltiples hilos Java 6 s propone nuevos mecanismos de control de procesos, que no vamos a estudiar aqu
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

Cuando

se inicia un programa en Java, la mquina virtual crea un hilo principal


El hilo se encargar de invocar al mtodo main de

la clase que se comienza a ejecutar El hilo termina cuando se acaba de ejecutar el mtodo main Si el hilo principal crea otros hilos, stos comenzarn su ejecucin de forma concurrente Slo cuando no queda ningn hilo activo, es cuando se termina el programa
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

La

clase principal para conseguir concurrencia en Java es la clase Thread


Dispone de un mtodo start() que ocasiona la

Todos

los hilos se ejecutan en la misma mquina virtual (mismo proceso)


Por tanto comparten recursos, como la memoria En realidad slo puede haber un hilo ejecutndose

ejecucin del cdigo que tenga dentro de su mtodo run() en un nuevo hilo

a la vez (se alternan, gracias a la concurrencia)


Laboratorio de Programacin de Sistemas Hilos y sincronizacin

Esquema

general

Se implementar el mtodo run, cuyo cdigo define

lo que va a hacer el hilo durante su ejecucin Se crear el hilo y se llama a su mtodo start, que se encarga, entre otras cosas, de llamar a run
Dos

alternativas posibles para la creacin

Implementando la interfaz Runnable 2. Heredando de la clase Thread


1.

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); }
}

Lo ms recomendable para aplicaciones de tamao medio-grande


Es ms flexible y permite combinar este interfaz con lo que heredemos de

cualquier otra clase Permite gestin de hilos de alto nivel mediante el API de Java: java.util.concurrent
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

public class HelloThread extends Thread { public void run() { System.out.println("Hello from a thread!"); }
public static void main(String args[]) { (new HelloThread()).start(); }

Lo ms cmodo para aplicaciones simples, al resultar ligeramente ms sencillo que lo anterior

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

10

El planificador de la mquina virtual de Java (MVJ) decide qu hilo ejecutar en cada momento
Hay cuestiones dependientes de la implementacin S es obligatorio que el planificador tenga en cuenta las prioridades de los hilos
Si hay varios hilos con la misma prioridad, todos se deben La creacin de un hilo en el S.O. subyacente La simulacin de los hilos dentro de la MVJ La especificacin no hace explcito el algoritmo a utilizar

ejecutar en algn momento No es obligatorio que deban ejecutarse hilos de menor prioridad si hay pendientes algunos con mayor prioridad

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

11

La clase Thread tiene dos mtodos para trabajar con las prioridades
setPriority(int) establece la prioridad del hilo. Puede

generar una excepcin si:

Para los valores de las prioridades, existen tres constantes estticas en la clase Thread
MAX_PRIORITY (=10): prioridad mxima MIN_PRIORITY (=1): prioridad mnima NORM_PRIORITY (=5): prioridad por defecto.

getPriority() devuelve la prioridad del hilo

El parmetro es invlido, o El hilo que invoca al mtodo no tiene los permisos necesarios para cambiarla

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

12

Tanto Swing como AWT crean un hilo nuevo


Consecuencias
Sirve para procesar los eventos de entrada (teclado y ratn) Es problemtico leer de teclado desde el hilo principal con Swing

Para que la interaccin con el usuario sea fluida, el hilo de Swing tiene prioridad 6, y los hilos normales 5
Cuando hay un evento de entrada, responde inmediatamente Cuando no hay eventos, el hilo est suspendido a la espera de los

lanzado: dos hilos leen simultneamente del mismo dispositivo Cuando hay eventos, el hilo de Swing es quien invoca los mtodos de usuario de procesado de eventos

mismos para no perjudicar a los otros hilos

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

13

Si la gestin del evento (hilo de Swing) lleva mucho tiempo, el resto de los eventos no se procesan
Evitar crear mtodos largos de gestin de eventos
La ventana parece no reaccionar a las rdenes del usuario!

Si el procesado de un evento va a durar demasiado, el gestor debera:


1. 2.

Bloquean el funcionamiento de la GUI hasta que terminan

Recopilar toda la informacin de los componentes Swing adecuados Crear un nuevo hilo que realice la tarea en paralelo

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

14

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

15

void sleep(long t) duerme el hilo durante al menos t milisegundos


void sleep(long milis, int nanos) versin con ms precisin (a nivel de nanosegundos) Las dos versiones del mtodo sleep pueden generar la excepcin InterruptedException que hay que capturar
En la prctica, las implementaciones no tienen tanta precisin Cuando transcurran, el hilo estar preparado para ejecutarse El planificador lo lanzar cuando considere oportuno

void yield() pausa temporalmente el hilo


No queda suspendido, sino que sigue estando preparado para la

ejecucin El planificador se activa y carga otro hilo para ejecutar, que podra ser el mismo
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

16

No se puede parar la ejecucin de un hilo desde fuera!


Para parar un hilo de ejecucin, tenemos que solicitrselo mediante interrupt(), y confiar en que nos har caso El hilo debera comprobar peridicamente si lo quieren parar
Algunos mtodos de la librera de Java generan una excepcin si En realidad s, pero se desaconseja (mtodos obsoletos)

durante su ejecucin se les intenta interrumpir (como es el caso de sleep()) As se comprueba si nos han mandado una interrupcin: Thread.interrupted() As se comprueba si otro hilo ha recibido una interrupcin: isInterrupted()

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

17

// Hilo que presenta un mensaje importante cada 4 segundos public class HiloObediente1 implements Runnable { // ... public void run() { for (int i = 0; i < importantInfo.length; i++) { // Paramos 4 segundos try { Thread.sleep(4000); } catch (InterruptedException e) { // Nos han pedido terminar. Obedecemos return; } // Escribimos el mensaje System.out.println(importantInfo[i]); } } // ...

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

18

// Hilo que multiplica 10000 matrices de 1000x1000 public class HiloObediente2 extends Runnable { // ...
void run() { for (int i = 0; i < 10000; i++) { this.multiplicaMatriz(i); if (Thread.interrupted()) // Nos han pedido que acabemos... break; // o return; } } } // ...

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

19

Esperar

la ejecucin de un hilo t para continuar la ejecucin


t.join()

Comprobar

si un hilo est activo

t.isAlive()

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

20

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

21

El

hecho de que varios hilos compartan el mismo espacio de memoria puede causar dos problemas
Interferencias 2. Inconsistencias
1.

Algunos

hilos necesitan esperar a otros para disponer de datos importantes o evitar problemas de acceso simultneo a recursos
Java proporciona mecanismos de sincronizacin de

hilos para tratar estos problemas


Laboratorio de Programacin de Sistemas Hilos y sincronizacin

22

Proporcionan exclusin mutua para acceder a un recurso compartido Uso de synchronized al declarar un mtodo

Sincronizando todo, se pierde la ventaja de la concurrencia pero se puede sincronizar nicamente la parte del cdigo del mtodo que interesa:
public void addName(String name) { //... synchronized ( this ) { // Cdigo importante, peligro de concurrencia } //... }
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

public synchronized void metodo() No es posible ejecutar simultneamente dos mtodos sincronizados del mismo objeto

23

Los

mtodos sincronizados se implementan utilizando monitores


un monitor interno que slo permite el acceso a un hilo de ejecucin a la vez

Todas las referencias (objetos y arrays) disponen de

Concepto de monitor Estructura de alto nivel para la gestin de concurrencia El monitor slo permite el acceso a un hilo a la vez Contiene una lista priorizada de hilos en espera para Podemos

crear objetos nuevos para usarlos como monitores


Laboratorio de Programacin de Sistemas Hilos y sincronizacin

entrar Gestiona dicho acceso

24

Cuando

dos o ms hilos son interdependientes, deben decidir entre ellos cundo esperar y cundo avanzar Sistema de parada y avance
tarea, se para a esperar Cuando el hilo B completa su tarea, B avisa a A para que contine su ejecucin

Cuando un hilo A depende de que otro B complete una

Implementacin

public void esperaCondicion ( ) { while ( !condicion ) { //No hacer nada } // Seguir ejecutando }
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

incorrecta: espera activa

25

Todos los objetos implementan los siguientes mtodos referidos a su monitor interno
wait() Detiene la ejecucin del hilo hasta recibir una

notificacin notify() Despierta a uno de los hilos detenidos


No se puede controlar especificamente a cual!

La gestin de la parada y el avance est integrada en el monitor


Para invocar el mtodo wait es necesario tener el control

notifyAll() Despierta a todos los hilos detenidos Todos pasan a estar en espera hasta que el planificador les ceda el turno, claro

del monitor por tanto, siempre debe activarse dentro de un mtodo sincronizado
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

26

No se garantiza que, cuando un hilo despierta, lo hace porque ya se cumple la condicin a la que estaba esperando, por lo que la llamada a wait se debe hacer en un while, en vez de en un if
En el hilo que espera:

En el otro hilo:

while(!condicion) { try { [this.]wait(); } catch (InterruptedException e) {} }


t.notifyAll();

Laboratorio de Programacin de Sistemas Hilos y sincronizacin

27

Interbloqueo o punto muerto (deadlock) Los hilos no se ejecutan por quedarse a la espera
Innanicin (starvation) Un hilo no puede acceder a un recurso compartido Interbloqueo activo (livelock) Los hilos no se ejecutan porque se estorban

de la ejecucin de otros hilos

porque otros hilos no le permiten el acceso

mutuamente, precisamente por intentar ambos evitar un interbloqueo


Laboratorio de Programacin de Sistemas Hilos y sincronizacin

28

Generalmente se usan un mnimo de dos hilos en las prcticas (con interfaz grfico)
El hilo principal Crea todas las ventanas y despus, idealmente, muere porque se termina el main El hilo de Swing Gestiona los eventos del usuario (se acaba convirtiendo en el hilo principal, digamos)

Si se necesitan inteligencias artificiales o entidades que realicen tareas por su cuenta (como subservidores para tratar con mltiples clientes), se usan hilos paralelos el tiempo que haga falta
Laboratorio de Programacin de Sistemas Hilos y sincronizacin

29

Federico Peinado www.federicopeinado.es

También podría gustarte