Está en la página 1de 19

Hilos

BUAP

Introduccin

Normalmente, los programas son ejecutados de


forma secuencial
nico flujo de control

Un programa con un nico flujo de control, ejecuta


slo una tarea (hilo)

Dr. Ivan Olmos

Introduccin

Histricamente, los sistemas de cmputo


personales slo han tenido un nico CPU
Al volverse ms poderosos los CPU, se
desarroll

S. O. multitarea / multiproceso
Programacin multitarea (multihilo), multiproceso

Programacin (pseudo)concurrente
Dr. Ivan Olmos

Hilos

Un hilo (thread) es un flujo de control


secuencial dentro de un programa
public class Hola_Mundo {
public static void main(String[] args) {
System.out.println("Hola Mundo\n");
}
}

Una aplicacin de control nico realiza su tarea ejecutando subtareas


de forma secuencial

Dr. Ivan Olmos

Hilos

Un programa puede generar dos o ms hilos


de ejecucin, los cuales siempre dependern
de la aplicacin principal

P. E. Imprimir diferentes mensajes desde una


aplicacin principal
Hola Mundo 1
Programa
Principal

Hola Mundo 2
Hola Mundo 3

Dr. Ivan Olmos

Caractersticas Generales de
los Hilos

Tpicamente, las tareas controlan un nico


aspecto dentro de un programa
Todas las tareas comparten los mismos
recursos
Aplicacin Java

Thread 1

Thread 2

Dr. Ivan Olmos

Thread 3

Multitarea vs. Multiproceso

Multiproceso: dos
programas se
ejecutan
aparentemente a la
vez, sin necesidad
de tener una relacin
entre ellos

Multitarea: dos o
ms tareas se
ejecutan a la vez
dentro de un mismo
programa

Dr. Ivan Olmos

Ejemplo
class TestHilos extends Thread{
private String nombre;
private int retardo;
//constructor
public TestHilos(String s, int d){
nombre = s;
retardo = d;
}

public class hilos {


public static void main(String[] args) {
TestHilos t1,t2,t3;
t1 = new TestHilos("hilo_1",(int)(Math.random()*2000));
t2 = new TestHilos("hilo_2",(int)(Math.random()*2000));
t3 = new TestHilos("hilo_3",(int)(Math.random()*2000));

//funcion para la ejecucion del hilo


t1.start();
public void run(){
t2.start();
try{
t3.start();
sleep(retardo);
}
} catch(InterruptedException e){
}
;
}
System.out.println("hola mundo " + nombre + " " + retardo);
}
}

Dr. Ivan Olmos

Programacin con
Hilos en Java

Introduccin

Java permite la ejecucin de diferentes hilos


a partir de clases derivadas de la clase
Thread, o bien a travs de la implementacin
de la clase Runnable
Mtodos de Clase

Thread

Mtodos de Instancia

Dr. Ivan Olmos

10

Mtodos de Clase

currentThread()

yield()

Devuelve el objeto Thread que representa a la


tarea que se esta ejecutando actualmente
Permite permutar la ejecucin de la tarea actual y
la siguiente tarea ejecutable disponible

sleep(long)

Provoca que la tarea en curso entre en pausa


durante un nmero de milisegundos indicado por
long
Dr. Ivan Olmos

11

Mtodos de Instancia

start()

run()

Cuerpo de una tarea o hilo de ejecucin. Es llamado por el


mtodo start()

stop()

Indica al interprete de java iniciar una tarea.


Inmediatamente se invoca al mtodo run()

Detiene la ejecucin de una tarea y la destruye

suspend()

Detiene la ejecucin sin destruir la tarea de sistema


subyacente ni el estado de la tarea anteriormente en
ejecucin
Dr. Ivan Olmos

12

Mtodos de Instancia

resume()
Utilizada para revivir una tarea suspendida, aunque no se
garantiza que se inicie su ejecucin de forma inmediata
setPriority(int)
Asigna la prioridad indicada por int a una tarea (rango de
valores: 1, , 10). Existen constantes predefinidas como
MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY
getPriority()
Devuelve la prioridad de una tarea en curso
setName(String)
Permite identificar a una tarea a travs de un nombre
getName()
Devuelve el valor actual de tipo cadena asignado como nombre
a la tarea

Dr. Ivan Olmos

13

Creacin de Tareas en Java


Implementacin de la
clase Runnable

Extender la clase Thread

class TestHilos extends Thread{


public void run(){

...

public class TestHilos implements Runnable{


Thread t;
public void run(){

...

}
}

}
}

Ventaja: hereda todos los mtodos


y variables de la clase Thread
Desventaja: slo se pueden
extender o derivar una vez de la
clase Thread

Ventaja: hereda todos los mtodos


y variables de la clase Thread;
adems permite heredar la clase
base a otras clases

Dr. Ivan Olmos

14

Ejemplo 1: Runnable
class NoHaceNada{
}
class MiHilo extends NoHaceNada implements Runnable{
private String nombre;
private int retardo;

public class Hilo2 {


public static void main(String[] args) {
Thread hiloA = new Thread(new MiHilo("Hilo1",
(int)(Math.random()*2000)), "hiloA");
Thread hiloB = new Thread(new MiHilo("Hilo2",
(int)(Math.random()*2000)), "hiloB");

public MiHilo(String s, int d){


nombre = s;
retardo = d;
}

hiloA.start();
hiloB.start();
try{
Thread.currentThread().sleep( 1000 );
} catch (InterruptedException e){}
System.out.println(Thread.currentThread());
}

public void run(){


try{
Thread.currentThread().sleep(retardo);
} catch (InterruptedException e){}
System.out.println("hola Mundo! " + nombre + " " + retardo
+ " " + Thread.currentThread());
}
}

Dr. Ivan Olmos

15

Ejemplo 2: Thread
class MiHilo extends Thread{
private String nombre;
private int retardo;

public class Hilos3 {


public static void main(String[] args) {

//constructor
public MiHilo(String s, int d){
nombre = s;
retardo = d;
}

Thread hiloA = new Thread(new MiHilo("hiloA",(int)


(Math.random()*2000)),"hiloA");
Thread hiloB = new Thread(new MiHilo("hiloB",(int)
(Math.random()*2000)),"hiloB");

public void run(){


try{
Thread.currentThread().sleep(retardo);
} catch (InterruptedException e){}
System.out.println("hola mundo! " + nombre + "
" + retardo + " " + Thread.currentThread());
}
}

hiloA.start();
hiloB.start();
try{
Thread.currentThread().sleep(1000);
} catch(InterruptedException e){}
System.out.println(Thread.currentThread());
}
}

Dr. Ivan Olmos

16

Ejemplo 3:
class TestHilos extends Thread{
private String nombre;
private int retardo;
//constructor
public TestHilos(String s, int d){
nombre = s;
retardo = d;
}

public class hilos {


public static void main(String[] args) {
TestHilos t1,t2,t3;
t1 = new TestHilos("hilo_1",(int)(Math.random()*2000));
t2 = new TestHilos("hilo_2",(int)(Math.random()*2000));
t3 = new TestHilos("hilo_3",(int)(Math.random()*2000));

//funcion para la ejecucion del hilo


t1.start();
public void run(){
t2.start();
try{
t3.start();
sleep(retardo);
}
} catch(InterruptedException e){
}
;
}
System.out.println("hola mundo " + nombre + " " + retardo);
}
}

Dr. Ivan Olmos

17

Sincronizacin de Hilos

Cuando se trabaja con hilos, es comn


realizar tareas de sincronizacin para:

Determinar cuando un hilo puede operar sobre


los datos comunes
Tomar como entrada de un hilo la salida de otro
hilo
Recursos compartidos

Dr. Ivan Olmos

18

Sincronizacin de Hilos

Para sincronizar hilos es importante utilizar


las funciones:

wait: esperar por un evento notify


notify: avisa a cualquier proceso que est en
espera por un objeto especfico

Analizar el ejemplo de sincronizacin


propuesto

Dr. Ivan Olmos

19

También podría gustarte