You are on page 1of 39

1

Programacin Multi-Hilo
Multiprocesamiento y Multitarea
Estados de los hilos
Creando hilos: clase Thread, interfaz Runnable
Prioridad
Palabra reservada sinchronized
Rafael Aguilar Garca
Rafael Aguilar Garca - ESCOM - POO

Multiproceso y Multitarea
2

Multiproceso significa que el equipo hardware


cuenta ms de un procesador (CPU) y por
tanto ejecuta varias tareas a la vez.
Multitarea significa que varias tareas
comparten el nico procesador (CPU)
dndonos la sensacin de multiproceso.
La multitarea se consigue mediante un
planificador de tareas que van dando slots de
CPU a cada tarea.

Rafael Aguilar Garca - ESCOM - POO

Tipos de Programacin Multitarea


3

Basada en procesos
Basada en hilos

Rafael Aguilar Garca - ESCOM - POO

Multitarea Basada en Procesos


4

El ordenador puede ejecutar dos o ms procesos de


forma concurrente
Un proceso es un programa en ejecucin.
En este esquema, un proceso es la unidad ms
pequea que un planificador puede seleccionar.
Por ejemplo, la ejecucin del compilador Java al
mismo tiempo que un editor de textos y que el
navegador de web.

Rafael Aguilar Garca - ESCOM - POO

Multitarea Basada en Procesos


5

Usada para tareas generales


Son tareas pesadas

Requieren

ms recursos de la CPU
La comunicacin entre procesos es costosa y
limitada
El intercambio de contextos de un proceso a otro es
pesado

Rafael Aguilar Garca - ESCOM - POO

Multitarea Basada en Hilos


6

Un proceso puede ejecutar dos o ms hilos, es decir,


puede realizar dos o ms tareas simultneas.
En este esquema el hilo es la unidad de cdigo ms
pequea que se puede seleccionar.
Por ejemplo, un editor de texto puede dar formato a
un texto al mismo tiempo que est imprimiendo ya
que estas acciones las realizan dos hilos distintos.

Rafael Aguilar Garca - ESCOM - POO

Multitarea - Basada en hilos


7

Un programa multihilo contiene dos o ms partes


que se pueden ejecutar de manera concurrente o
simultnea.
Cada parte del programa se denomina hilo
(thread), y cada hilo define un camino de ejecucin
independiente.
Es una forma especializada de multitarea

Rafael Aguilar Garca - ESCOM - POO

Programacin Multihilo
8

Rafael Aguilar Garca - ESCOM - POO

Programacin Multihilo
9

Un thread es un contexto de ejecucin,


proceso ligero o tarea. Dentro de un programa
pueden haber varios threads abiertos.
Un thread es un proceso ligero en donde hay
un flujo secuencial de control y que utiliza los
recursos disponibles para un programa.
Al ejecutar un programa Java pueden haber
varios threads ejecutndose (manejo de
eventos, main, ...).

Rafael Aguilar Garca - ESCOM - POO

Programacin Multihilo
10

Rafael Aguilar Garca - ESCOM - POO

Ciclo de vida de un hilo


11

Rafael Aguilar Garca - ESCOM - POO

Creacin de un hilo
12

Heredando de la clase Thread


Implementandola interfaz
Runnable

Rafael Aguilar Garca - ESCOM - POO

La clase Thread
13

Algunos mtodos de la clase Thread:


Mtodo

Descripcin

getName

Obtiene el nombre de un hilo

getPriority

Obtiene la prioridad de un hilo

isAlive

Determina si un hilo todava se est ejecutando

join

Espera la terminacin de un hilo

run

Punto de entrada de un hilo

sleep

Suspende un hilo durante un perodo de tiempo

start

Comienza la ejecucin de un hilo llamando a su


mtodo run

Rafael Aguilar Garca - ESCOM - POO

El hilo principal
14

Cuando un programa Java comienza su ejecucin,


ya hay un hilo ejecutndose al cual denominamos
hilo principal del programa,.
Es el nico que se ejecuta al comenzar el programa.
Es el hilo a partir del cual se crean el resto de los
hilos del programa.
Normalmente, debe ser el ltimo que finaliza su
ejecucin. Cuando el hilo principal finaliza, el
programa termina.
Rafael Aguilar Garca - ESCOM - POO

El hilo principal
15

Aunque el hilo principal se crea automticamente


cuando el programa comienza, podemos controlarlo a
travs de un objeto Thread, obteniendo una referencia
a partir del mtodo currentThread :
static Thread currentThread( )

Este mtodo devuelve una referencia al hilo desde


donde fue llamado. Una vez obtenida la referencia
del hilo principal, se puede controlar del mismo modo
que cualquier otro hilo.
Rafael Aguilar Garca - ESCOM - POO

16

Rafael Aguilar Garca - ESCOM - POO

Ejemplo:
17

//Control de hilo principal


public class DemoHiloActual {
public static void main(String args[ ]) {
Thread t = Thread.currentThread( );
System.out.printl(Hilo actual: + t);
// Cambio del nombre del hilo
t.setName(Mi Hilo);
System.out.printl(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);
}
}
}
Rafael Aguilar Garca - ESCOM - POO

Salida del programa anterior


18

Hilo actual: Thread[main,5,main]


Despus del cambio de nombre: Thread[Mi Hilo,5,main]
5
4
3
2
1

Rafael Aguilar Garca - ESCOM - POO

Creacin de un hilo en Java


19

En un sentido amplio, se puede crear


un hilo creando un objeto del tipo
Thread. Java define dos formas en la
que se puede hacer esto:
Implementando la interfaz Runnable
Extendiendo la propia clase Thread

Rafael Aguilar Garca - ESCOM - POO

Implementando la interfaz Runnable


20

La forma ms fcil de crear un hilo es creando una


clase que implemente la interfaz Runnable.
Permite abstraer una unidad de cdigo ejecutable.
Se puede construir un hilo sobre cualquier objeto
que implemente la interfaz Runnable. Para ello, una
clase necesita implementar un nico mtodo
llamado run( ), que se declara de la siguiente
forma:
public void run( )
Rafael Aguilar Garca - ESCOM - POO

El mtodo run( )
21

Definir el cdigo que constituye el nuevo hilo.


Puede llamar a otros mtodos, usar otras clases, y
declarar variables de la misma forma que el hilo
principal main( ).
La nica diferencia con main( ) es que el mtodo
run( ) establece el punto de entrada para otro hilo
de ejecucin concurrente dentro del programa.
Este hilo finalizar cuando el mtodo run( )
devuelva el control.
Rafael Aguilar Garca - ESCOM - POO

El mtodo start( )
22

El nuevo hilo que se acaba de crear no comenzar su


ejecucin hasta que se llame al mtodo start( ),
declarado dentro de Thread.
Esencialmente, start( ) ejecuta una llamada a run( ).
La declaracin del mtodo start( ) es la siguiente:
void start( );
El ejemplo siguiente crea un segundo hilo:

Rafael Aguilar Garca - ESCOM - POO

//Creacin de un segundo hilo

class NewThread implements Runnable {


Thread t;
NewThread( ) {
//Crea el segundo hilo
t = new Thread(this, Hilo demo);
System.out.println(Hilo hijo, + t);
t.start( ); // Comienzo del hilo
}
// Este es el punto de entrada para el segundo hilo
public void run( ){
try{
for( int i = 5; i > 0 ; i--) {
System.out.println(Hilo hijo + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println(Interrupcin del hilo hijo.);
}
System.out.println(Salida del hilo hijo);
}
}

23

Rafael Aguilar Garca - ESCOM - POO

//Continuacin
class DemoHilo {
public static void main(String args[ ]) {
new NewThread( );
// Creacin de un nuevo hilo
try{
for(int i = 5; i > 0; i--) {
System.out.println(Hilo principal: + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(Interrupcin del hilo principal);
}
System.out.println(Salida del hilo principal);
}
}

24

Rafael Aguilar Garca - ESCOM - POO

Salida:
25

Hilo hijo: Thread[Hilo demo, 5, main]


Hilo principal: 5
Hilo hijo: 5
Hilo hijo: 4
Hilo principal: 4
Hilo hijo: 3
Hilo hijo: 2
Hilo principal: 3
Hilo hijo: 1
Salida del hilo hijo.
Hilo principal: 2
Hilo principal: 1
Salida del hilo principal.

Rafael Aguilar Garca - ESCOM - POO

Usando la clase Thread


26

La segunda forma de crear un hilo es mediante la


creacin de una nueva clase que extienda a la
clase Thread, y crear entonces una instancia de esa
clase.
La nueva clase debe sobrescribir el mtodo run( ),
que es el punto de entrada para el nuevo hilo.
Tambin debe llamar al mtodo start( ) para
comenzar la ejecucin del nuevo hilo.
A continuacin el programa anterior ahora
extendiendo la clase Thread:
Rafael Aguilar Garca - ESCOM - POO

//Creacin de un segundo hilo extendiendo la clase Thread


class NewThread extends Thread {
NewThread( ) {
//Creacin de un nuevo hilo
super(Hilo demo);
System.out.println(Hilo hijo: + this);
start( ); // Comienza el hilo
}
// Este es el punto de entrada para el segundo hilo
public void run( ){
try{
for( int i = 5; i > 0 ; i--) {
System.out.println(Hilo hijo + i);
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println(Interrupcin del hilo hijo.);
}
System.out.println(Salida del hilo hijo);
}
}

27

Rafael Aguilar Garca - ESCOM - POO

//Continuacin
public class ExtendThread {
public static void main(String args[ ]) {
new NewThread( );
// Creacin de un nuevo hilo
try{
for(int i = 5; i > 0; i--) {
System.out.println(Hilo principal: + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println(Interrupcin del hilo
principal);
}
System.out.println(Salida del hilo principal);
}
}

28

Rafael Aguilar Garca - ESCOM - POO

Creacin de mltiples hilos


29

Hasta ahora solo se han usado dos hilos: el hilo


principal y un hilo hijo. Sin embargo, un programa
puede generar tantos hilos como necesite. El
siguiente programa crea tres hilos hijo:

Rafael Aguilar Garca - ESCOM - POO

//Creacin de mltiples hilos


class NewThread implements Runnable {
String name; //Nombre del hilo
Thread t;
NewThread(String threadName) {
name = threadName;
t = new Thread(this, name);
System.out.println(Nuevo hilo: + t);
t.start( ); // Comienza el hilo
}
// Este es el punto de entrada del hilo
public void run( ) {
try {
for( int i = 5; i > 0; i--) {
System.out.println(name + : + i);
Thread.sleep(1000);
}
} catch (InterruptedException e){
System.out.println(Interrupcin del hilo + name);
}
System.out.println(Salida del hilo + name);
}
}

30

Rafael Aguilar Garca - ESCOM - POO

//Continuacin - Creacin de mltiples hilos


class MultiThreadDemo {
public static void main(String args[ ]){
new NewThread(Uno);
new NewThread(Dos);
new NewThread(Tres);
try {
// Espera a que los otros hilos terminen
Thread.sleep(10000);
} catch (InterruptedException e ){
System.out.println(Interrupcion del hilo principal);
}
System.out.println(Salida del hilo principal);
}
}

31

Rafael Aguilar Garca - ESCOM - POO

Nuevo hilo: Thread[Uno,5,main]


Nuevo hilo: Thread[Dos,5,main]
Nuevo hilo: Thread[Tres,5,main]
Uno: 5
Dos: 5
Tres: 5
Uno: 4
Dos: 4
Tres: 4
Uno: 3
Tres: 3
Dos: 3
Uno: 2
Tres: 2
Dos: 2
Uno: 1
Tres: 1
Dos: 1
Salida del hilo Uno.
Salida del hilo Dos.
Salida del hilo Tres.
Salida del hilo principal..
32

Rafael Aguilar Garca - ESCOM - POO

Utilizacin de isAlive y join


33

Ahora veamos cmo hacer que el hilo principal


(main) termine al final de todos los hilos sin usar el
mtodo sleep( ).
Para lograr esto necesitamos responder la siguiente
pregunta Cmo puede un hilo saber si otro ha
terminado? La clase Thread nos da la respuesta.

Rafael Aguilar Garca - ESCOM - POO

Utilizacin de isAlive y join


34

Existen dos formas de determinar si un hilo ha


terminado.
La primera consiste en llamar al mtodo isAlive( )
en el hilo. Este es un mtodo definido por Thread y
su forma general es la siguiente:
final boolean isAlive( )
El mtodo isAlive( ) devuelve el valor true si el hilo
al que se hace referencia est todava
ejecutndose, y devuelve el valor false en caso
contrario.
Rafael Aguilar Garca - ESCOM - POO

Utilizacin de isAlive y join


35

El mtodo isAlive( ) es til en ocasiones; sin embargo, el


mtodo que se utiliza habitualmente para esperar a que
un hilo termine es el mtodo join( )
final void join( ) throws InterruptedException
Este mtodo espera hasta que termine el hilo sobre el que
se realiz la llamada.
Su nombre surge de la idea de que el hilo llamante
espere hasta que el hilo especificado se rena con l.
Otras formas de join( ) permiten especificar un tiempo
mximo de espera para que termine el hilo especificado.
Rafael Aguilar Garca - ESCOM - POO

Utilizacin de isAlive y join


36

A continuacin se presenta una versin mejorada


del ejemplo anterior que utiliza el mtodo join( )
para asegurar que el hilo principal es el ltimo en
terminar.
Tambin sirve de ejemplo del mtodo isAlive( ).

Rafael Aguilar Garca - ESCOM - POO

//Uso de isAlive y join


class NewThread implements Runnable {
String name; //Nombre del hilo
Thread t;
NewThread(String threadName) {
name = threadName;
t = new Thread(this, name);
System.out.println(Nuevo hilo: + t);
t.start( ); // Comienzo del hilo
}
// Este es el punto de entrada del hilo
public void run( ) {
try {
for( int i = 5; i > 0; i--) {
System.out.println(name + : + i);
Thread.sleep(1000);
}
} catch (InterruptedException e){
System.out.println(Interrupcin del hilo + name);
}
System.out.println(Salida del hilo + name);
}
}
37

Rafael Aguilar Garca - ESCOM - POO

//Continuacin de isAlive y join


class DemoJoin {
public static void main(String args[ ]){
NewThread ob1 = new NewThread(Uno);
NewThread ob2 = new NewThread(Dos);
Newthread ob3 = new newThread(Tres);
System.out.println(El hilo Uno est vivo: + ob1.t.isAlive( ));
System.out.println(El hilo Dos est vivo: + ob2.t.isAlive( ));
System.out.println(El hilo Tres est vivo: + ob3.t.isAlive( ));
// Espera a que los otros hilos terminen
try {
System.out.println(Espera la finalizacin de los otros hilos);
ob1.t.join( );
ob2.t.join( );
ob3.t.join( );
} catch (InterruptedException e ){
System.out.println(Interrupcion del hilo principal);
}
System.out.println(El hilo Uno est vivo: + ob1.t.isAlive( ));
System.out.println(El hilo Dos est vivo: + ob2.t.isAlive( ));
System.out.println(El hilo Tres est vivo: + ob3.t.isAlive( ));
System.out.println(Salida del hilo principal.);
}
}
38

Rafael Aguilar Garca - ESCOM - POO

Nuevo hilo: Thread[Uno,5,main]


Nuevo hilo: Thread[Dos,5,main]
Nuevo hilo: Thread[Tres,5,main]
El hilo Uno esta vivo: true
El hilo Dos esta vivo: true
El hilo Tres esta vivo: true
Espera la finalizacin de los otros hilos
Uno: 5
Dos: 5
Tres: 5
Uno: 4
Dos: 4
Tres: 4
Uno: 3
Dos: 3
Tres: 3
Uno: 2
Dos: 2
Tres: 2
Uno: 1
Dos: 1
Tres: 1
Salida del hilo Dos.
Salida del hilo Tres.
Salida del hilo Uno.
El hilo Uno esta vivo: false
El hilo Dos esta vivo: false
El hilo Tres esta vivo: false
Salida del hilo principal.
Rafael Aguilar Garca - ESCOM - POO
39

You might also like