Hilos en Java
Introduccin
Hilo: flujo de ejecucin secuencial
independiente dentro de un proceso
Los hilos de un proceso comparten el espacio
de direcciones, pero tienen su propio
contador de programa y su propia pila de
ejecucin.
Ejemplo de hilos dentro de un proceso: un
navegador en ejecucin es un proceso y cada una
de las ventanas de navegacin abiertas son hilos
independientes dentro del proceso.
La clase Thread permite representar a los
hilos de ejecucin.
Redes
Creacin y ejecucin de hilos
Creacin de hilos con la clase Thread
Paso 1: Crear una clase que extienda la clase Thread.
Paso 2: Implementar el mtodo run(). Este mtodo es el
cuerpo del hilo. El hilo muere al finalizar run().
public class MiHilo extends Thread
{
String Mensaje;
public MiHilo(String nombre, String m)
{
super(nombre);
Mensaje = m;
}
public void run()
{
for(int i = 0; i < 10; i++)
{
[Link](getName() + : + Mensaje);
try {sleep((long)([Link]() * 1000)); }
catch (InterruptedException e) {[Link]([Link]());}
}
}
}
Redes
Creacin y ejecucin de hilos
Arranque de un hilo
Paso 1: Crear una clase que lance los hilos.
Paso 2: Invocar al operador new para crear los hilos.
Paso 3: Invocar al mtodo start() de cada hilo. Este
mtodo arranca el hilo e invoca al mtodo run().
public class VariosHilos
{
public static void main(String args[])
{
MiHilo hilo1, hilo2;
hilo1 = new MiHilo(Hilo1, Hola);
hilo2 = new MiHilo(Hilo2, Adios);
[Link]();
[Link]();
}
}
Redes
Creacin y ejecucin de hilos
Finalizacin de un hilo
Mtodo 1: llamada al mtodo stop(). Finaliza el hilo de
forma brusca, sobre todo si se ejecuta sobre el hilo en
curso. No es un mtodo muy elegante y est en desuso.
Mtodo 2: mtodo run() finaliza su ejecucin. Se puede
utilizar alguna variable que le indique al mtodo run que
debe finalizar. De esta forma se finaliza el hilo de manera
ordenada. Es un mtodo ms elegante.
Redes
Clase Thread
Thread currentThread(): retorna el hilo en ejecucin.
void yield(): el siguiente hilo ejecutable disponible pasa a ser el
hilo en ejecucin.
void sleep(long millis): duerme al hilo millis milisegundos.
void start(): comienza la ejecucin del hilo.
void run(): cuerpo del hilo.
void setName(String name): establece un nombre para el hilo.
String getName(): retorna el nombre del hilo.
void setPriority(): establece una prioridad para el hilo (valor
entre 1 y 10) (MIN_PRIORITY=1 NORM_PRIORITY=5
MAX_PRIORITY=10).
int getPriority(): retorna la prioridad del hilo
Boolean isAlive(): retorna true si el hilo ha sido arrancado con
start() y no ha terminado su ejecucin (puede estar dormido).
Redes
Ciclo de vida de un hilo
yield()
Nuevo Thread
start()
Ejecutable
stop()
run() terminado
stop()
pasado el tiempo de sleep
fin de la E/S
notify() o notifyAll()
Muerto
Parado
sleep()
bloqueado en E/S
wait()
stop()
Redes
Sincronizacin de hilos
Los hilos pueden utilizar objetos comunes y manipularlos de
forma independiente.
El acceso a las regiones crticas se controla con los mtodos
synchronized. Un mtodo synchronized de un objeto slo
puede ser ejecutado por un nico hilo en cada momento.
Tambin se pueden sincronizar variables.
El envo y recepcin de seales entre los hilos se realiza con los
mtodos wait(), notify() y notifyAll()
Redes
void wait() duerme al hilo hasta la llegada de un notify().
void notify() despierta a uno de los hilos que estaban
esperando por el objeto.
void notifyAll() despierta a todos los hilos que estaban
esperando por el objeto.
Ejemplo de sincronizacin de hilos
public class Productor extends Thread
{
private Almacen almacen;
public Productor(Almacen a)
{
almacen = a;
}
public void run()
{
for(int i = 0; i < 10; i++)
{
[Link](Productor produce: + i);
[Link]( i);
try {sleep((long)([Link]() * 100)); }
catch (InterruptedException e)
{[Link]([Link]());}
}
}
}
public class Consumidor extends Thread
{
private Almacen almacen;
public Consumidor(Almacen a)
{
almacen = a;
}
public void run()
{
for(int i = 0; i < 10; i++)
{
[Link](Consumidor consume:
+ [Link]());
try {sleep((long)([Link]() * 200)); }
catch (InterruptedException e)
{[Link]([Link]());}
}
}
}
Redes
Ejemplo de sincronizacin de hilos
public class Almacen
{
private int valor;
private boolean valorconsumido;
public Almacen()
{
valorconsumido = true;
}
public synchronized void put(int v)
{
while(!valorconsumido)
{
try{wait();}
catch(InterruptedException e){}
}
valor = v;
valorconsumido = false;
notify();
}
Redes
public synchronized int get()
{
while(valorconsumido)
{
try{wait();}
catch(InterruptedException e){}
}
valorconsumido = true;
notify();
return valor;
}
}
public class ProductorConsumidor
{
public static void main(String args[])
{
Almacen a = new Almacen();
Productor p = new Productor(a);
Consumidor c = new Consumidor(a);
[Link]();
[Link]();
}
}
Ejercicios de hilos
Realizar un programa con 4 hilos. Cada uno de ellos
mostrar 5 mensajes por pantalla indicando su
nombre y la hora actual. Despus de cada acceso a
la pantalla se dormirn 1000 milisegundos.
Simular una cuanta bancaria con dos hilos. Uno
simular el ingreso y el otro la extraccin de dinero
de la cuenta. La cuenta tendr un capital inicial.
Realizar 10 ingresos y 5 extracciones.
Realizar un programa que lea frases por teclado
hasta que se introduzca una lnea con la palabra fin y
lo grabe en un fichero. Se disearn dos hilos, uno se
encargar de la lectura de las frases y el otro de la
grabacin del fichero.
Redes
10