Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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,
cambiando muy rpido entre ellos, parece como si se ejecutaran simultneamente (programacin concurrente)
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
Cuando
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
Todos
ejecucin del cdigo que tenga dentro de su mtodo run() en un nuevo hilo
Esquema
general
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
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(); }
}
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(); }
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
11
La clase Thread tiene dos mtodos para trabajar con las prioridades
setPriority(int) establece la prioridad del hilo. Puede
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.
El parmetro es invlido, o El hilo que invoca al mtodo no tiene los permisos necesarios para cambiarla
12
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
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!
Recopilar toda la informacin de los componentes Swing adecuados Crear un nuevo hilo que realice la tarea en paralelo
14
15
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
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()
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]); } } // ...
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; } } } // ...
19
Esperar
Comprobar
t.isAlive()
20
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
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
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
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
Implementacin
public void esperaCondicion ( ) { while ( !condicion ) { //No hacer nada } // Seguir ejecutando }
Laboratorio de Programacin de Sistemas Hilos y sincronizacin
25
Todos los objetos implementan los siguientes mtodos referidos a su monitor interno
wait() Detiene la ejecucin del hilo hasta recibir una
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:
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
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