Sie sind auf Seite 1von 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 3

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

Thread 3

Dr. Ivan Olmos

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 Mtodos de Instancia

Thread

Dr. Ivan Olmos

10

Mtodos de Clase

currentThread()

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 Provoca que la tarea en curso entre en pausa durante un nmero de milisegundos indicado por long
Dr. Ivan Olmos 11

yield()

sleep(long)

Mtodos de Instancia

start()

Indica al interprete de java iniciar una tarea. Inmediatamente se invoca al mtodo run() Cuerpo de una tarea o hilo de ejecucin. Es llamado por el mtodo start() Detiene la ejecucin de una tarea y la destruye Detiene la ejecucin sin destruir la tarea de sistema subyacente ni el estado de la tarea anteriormente en ejecucin
Dr. Ivan Olmos 12

run()

stop()

suspend()

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


Extender la clase Thread Implementacin de la clase Runnable

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 MiHilo(String s, int d){ nombre = s; retardo = d; } public void run(){ try{ Thread.currentThread().sleep(retardo); } catch (InterruptedException e){} System.out.println("hola Mundo! " + nombre + " " + retardo + " " + Thread.currentThread()); } } 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"); hiloA.start(); hiloB.start(); try{ Thread.currentThread().sleep( 1000 ); } catch (InterruptedException e){} System.out.println(Thread.currentThread()); } }

Dr. Ivan Olmos

15

Ejemplo 2: Thread
class MiHilo extends Thread{ private String nombre; private int retardo; //constructor public MiHilo(String s, int d){ nombre = s; retardo = d; } public void run(){ try{ Thread.currentThread().sleep(retardo); } catch (InterruptedException e){} System.out.println("hola mundo! " + nombre + " " + retardo + " " + Thread.currentThread()); } }

public class Hilos3 { public static void main(String[] args) { Thread hiloA = new Thread(new MiHilo("hiloA",(int) (Math.random()*2000)),"hiloA"); Thread hiloB = new Thread(new MiHilo("hiloB",(int) (Math.random()*2000)),"hiloB"); 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

Das könnte Ihnen auch gefallen