Vous êtes sur la page 1sur 6

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++)
{
System.out.println(getName() + : + Mensaje);
try {sleep((long)(Math.random() * 1000)); }
catch (InterruptedException e) {System.out.println(e.toString());}
}
}
}

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);
hilo1.start();
hilo2.start();
}
}

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++)
{
System.out.println(Productor produce: + i);
almacen.put( i);
try {sleep((long)(Math.random() * 100)); }
catch (InterruptedException e)
{System.out.println(e.toString());}
}
}
}

public class Consumidor extends Thread


{
private Almacen almacen;
public Consumidor(Almacen a)
{
almacen = a;
}
public void run()
{
for(int i = 0; i < 10; i++)
{
System.out.println(Consumidor consume:
+ almacen.get());
try {sleep((long)(Math.random() * 200)); }
catch (InterruptedException e)
{System.out.println(e.toString());}
}
}
}

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);
p.start();
c.start();
}
}

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

Vous aimerez peut-être aussi