Académique Documents
Professionnel Documents
Culture Documents
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)
Introduccin
Histricamente, los sistemas de cmputo personales slo han tenido un nico CPU Al volverse ms poderosos los CPU, se desarroll
Programacin (pseudo)concurrente
Dr. Ivan Olmos 3
Hilos
Una aplicacin de control nico realiza su tarea ejecutando subtareas de forma secuencial
Hilos
Un programa puede generar dos o ms hilos de ejecucin, los cuales siempre dependern de la aplicacin principal
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
Multiproceso: dos programas se ejecutan aparentemente a la vez, sin necesidad de tener una relacin entre ellos
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); } }
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
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
13
...
} }
...
} }
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
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()); } }
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()); } }
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); } }
17
Sincronizacin de Hilos
Determinar cuando un hilo puede operar sobre los datos comunes Tomar como entrada de un hilo la salida de otro hilo Recursos compartidos
18
Sincronizacin de Hilos
wait: esperar por un evento notify notify: avisa a cualquier proceso que est en espera por un objeto especfico
19