Vous êtes sur la page 1sur 25

Programacin Concurrente,

Multihilo
Programacin Multihilo
A diferencia de la mayora de los lenguajes de
programacin, Java proporciona soporte para la
programacin Multihilo.
Programacin Multihilo
Un programa multihilo contiene 2 o ms partes que
pueden ser ejecutadas de manera concurrente o
simultnea.
Cada parte del programa se denomina hilo y cada
hilo define un camino de ejecucin independiente.
Por lo tanto, la programacin multihilo es una forma
especializada de multitarea.
Programacin Multihilo
La multitarea lo permiten la mayora de los sistemas
operativos modernos.
Existen 2 tipos distintos de multitarea: la basada en
procesos y la basada en hilos.
Un proceso es en esencia un programa que se est
ejecutando, por lo que la multitarea basada en
proceso es la que permite ejecutar 2 programas
concurrentemente.
Programacin Multihilo
En la multitarea basada en procesos, un programa es
la unidad ms pequea de cdigo que el sistema
puede gestionar.
En la multitarea basada en hilos, el hilo es la unidad
de cdigo ms pequea que se puede gestionar. Esto
significa que un solo programa puede realizar 2 o
ms tareas simultneamente
Programacin Multihilo
Por tanto, la multitarea basada en procesos acta
sobre tareas generales, mientras que la multitarea
basada en hilos gestiona los detalles.
Los procesos son tareas mas pesadas, es decir
requieren ms recursos. Los hilos por otra parte, son
tareas ligeras. La comunicacin entre hilos como el
intercambio de contextos de un hilo al prximo tiene
un costo bajo.
Programacin Multihilo
Los programas de Java utilizan entornos multitarea
basadas en procesos, pero la multitarea basada en
procesos no est bajo el control de Java. Sin
embargo, la multitarea basada en hilos si.
Programacin Multihilo
La multitarea basada en hilos permite escribir
programas muy eficientes que hacen uso ptimo del
CPU, ya que el tiempo que ste est libre se reduce
al mximo.
Programacin Multihilo
En un entorno tradicional de un solo hilo, el
programa tiene que esperar a que se realice cada
tarea antes de procesar la siguiente, aunque el cpu
est inactivo la mayor parte del tiempo.
La multitarea basada en hilos permite acceder y
aprovechar este tiempo de inactividad del CPU.
El modelo de hilos en Java
Los sistemas de un solo hilo utilizan un enfoque
denominado ciclo de evento con sondeo. En este
modelo, un solo hilo de control se ejecuta en un
ciclo infinito, sondeando una nica cola de eventos
para decidir cual se procesar a continuacin.
El modelo de hilos en Java
Hasta que un evento regrese el control, nada ms
puede ocurrir en el sistema, y esto supone un
desaprovechamiento del CPU. En general, en un
entorno de un solo hilo, cuando un hilo bloquea(es
decir, suspende la ejecucin) porque est esperando
algn recurso, el programa entero se detiene.
El modelo de hilos en Java
La ventaja de la programacin multihilo en Java es
que se elimina el mecanismo principal de ciclo/
sondeo. Un hilo puede detenerse sin paralizar el
resto de las partes del programa. Por ejemplo, el
tiempo de inactividad que se produce cuando un hilo
lee datos de la red o espera a que el usuario
introduzca informacin, puede ser aprovechado por
otro hilo.
El modelo de hilos en Java
Cuando en un programa Java, un hilo se bloquea,
solo ese hilo se detiene y todos los dems continan
su ejecucin.

El modelo de hilos en Java
Los hilos puede encontrarse en distintos estados. Un
hilo puede estar ejecutndose o preparado para
ejecutarse tan pronto como se disponga de tiempo
de CPU. Un hilo que est ejecutndose puede estar
suspendido, lo que significa que temporalmente se
suspende su actividad. Un hilo suspendido puede
reanudarse, un hilo puede estar bloqueado cuando
se est esperando un determinado recurso y
cualquier instante un hilo puede detenerse, una vez
detenido, un hilo no puede reanudarse.

Prioridades en hilos
Java asigna a cada hilo una prioridad que
determina como se debe tratar ese hilo en
comparacin con los dems.
Las prioridades de los hilos son valores
enteros que especifican la prioridad relativa
de un hilo sobre otro.
La prioridad de un hilo se utiliza para decidir
cuando se debe pasar de la ejecucin de un
hilo a la del siguiente. A esto se denomina,
cambio de contexto
Prioridades en hilos
Las reglas que determinan cuando debe
tener lugar un cambio de contexto, son muy
sencillas:
Un hilo puede ceder voluntariamente el
control. Se hace por abandono explcito, al
quedarse dormido, o bloqueado por una E/S
pendiente. Cuando esto ocurre se examinan
los dems hilos y se le asigna el CPU al que
est preparado para ejecutarse y tenga la
ms alta prioridad.
Prioridades en hilos
Un hilo puede se desalojado por otro con
prioridad ms alta. En este caso, un hilo con
prioridad ms baja que no libera el
procesador es simplemente desalojado, sin
tener en cuenta lo que est haciendo, por
otro de prioridad ms alta. A esto se
denomina multitarea por desalojo.

Intercambio de mensajes
Despus de dividir el programa en distintos
hilos, es necesario definir como se
comunicarn entre si. Java proporciona una
forma limpia y de bajo costo que permite la
comunicacin entre 2 o ms hilos, por medio
de llamadas a mtodos predefinidos que
tienen todos los objetos. El sistema de
mensajes de java permite que un hilo entre
en un mtodo sincronizado de un objeto y
espere ah hasta que otro hilo le notifique
explcitamente que debe salir.
La clase Thread y la interfaz
Runnable
El sistema multihilo de Java est construido
en torno a la clase Thread, sus mtodos y su
correspondiente interfaz, Runnable. La clase
Thread encapsula a un hilo de ejecucin.
Para crear un nuevo hilo, el programa deber
extender la clase Thread o bien implementar
la interfaz Runnable.
Hasta el momento todos los ejemplos que
hemos visto han utilizado un solo hilo de
ejecucin, el hilo principal.
El hilo principal
Cuando un programa Java comienza su
ejecucin, hay un hilo ejecutndose
inmediatamente, a este hilo se le denomina
hilo principal del programa, este es
importante por 2 razones:
1. Es el hilo a partir del cual se crean el resto
de los hilos del programa.
2. Normalmente, debe ser el ltimo que
finaliza su ejecucin, ya que es el
responsable de realizar diversas acciones de
cierre.
El hilo principal
Aunque el hilo principal se crea
automticamente cuando el programa
comienza, se puede controlar a travs de un
objeto Thread. Para ello, se debe obtener
una referencia al mismo llamando al mtodo
currentThread(), que es un miembro public
static de la clase Thread.
Comencemos con el primer ejemplo.
class DemoHiloActual {
public static void main (String args[ ]) {
Thread t= Thread.currentThread();
System.out.println (Hilo actual: + t);
t.setName (Mi Hilo);
System.out.println (Despus del cambio de nombre: + t);
try {
for (int n=5; n>0; n--) {
System.out.println (n);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println (interrupcin del hilo principal);
}
}
}
Salida generada:

Hilo actual: Thread[main,5,main]
Despus del cambio de nombre: Thread[Mi Hilo,5,main]
5
4
3
2
1
Creacin de un Hilo
En sentido amplio se puede crear un hilo
creando un objeto del tipo Thread. Java
define 2 formas en las que se puede hacer
esto:
1. Implementando la interfaz Runnable
2. Extendiendo la propia clase Thread.
Veamos cada uno de ellos.

Creacin de un Hilo, implementado la interfaz Runnable
//creacin de un segundo hilo
Class NewThread implements Runnable {
Thread t:
NewThread ( ) {
t=new Thread (this, Hilo demo);
System.out.println (Hilo hijo: +t);
t.start(); //comienza la ejecucin
}
public void run( ) { //cdigo del hilo
try {
for (int i = 5; i>0;i - -) {
System.out.println (Hilo hijo: +i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println(Interrupcion del hilo hijo. );
} // fin del metodo run
System.out.println (Salida del hilo hijo);
}
}
Class DemoHilo {
public static void main (String args[ ]) {
new NewThread( ); creacion del nvo hilo
try {
for (int i=5;i>0:i - -) {
System.out.println(Hilo principal: +i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(Interrupcion del hilo principal);
}
System.out.println (Salida del hilo principal);
}
}
El mtodo run() es el punto de entrada para
otro hilo de ejecucin concurrente dentro
del programa, este hilo finaliza cuando el
mtodo run() devuelva el control.

El argumento this indica que el nuevo hilo
llame al mtodo run()
Nota: La salida del programa depende de la velocidad del procesador y la carga de tareas.
class TestTh extends Thread {
private String nombre;
private int retardo;
public TestTh( String s,int d ) {
nombre = s;
retardo = d;
}
public void run() {
try {
sleep( retardo );
} catch( InterruptedException e ) {
;
}
System.out.println( "Hola Mundo! "+nombre+" "+retardo );
}
}

public class MultiHola {
public static void main( String args[] ) {
TestTh t1,t2,t3;
t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) );
t2 = new TestTh( "Thread 2",(int)(Math.random()*2000) );
t3 = new TestTh( "Thread 3",(int)(Math.random()*2000) );
t1.start();
t2.start();
t3.start();
}
}
Salida del programa:

Hola Mundo! Thread 2 202
Hola Mundo! Thread 3 1306
Hola Mundo! Thread 1 1608

Process completed.
Creacin de un Hilo, extendiendo la clase Thread

Vous aimerez peut-être aussi