You are on page 1of 11

Procesos Paralelos en Java

?

Ejemplo de Applet (animabola)

?

?

Los sistemas operativos realizan en "paralelo" diversos procesos, repartiendo el tiempo de CPU según prioridades. Java incorpora el concepto de hilo (thread) que son procesos lanzados por otro proceso, que devuelven el control sin haber terminado de ejecutarse. Los threads forman parte del paquete Java.lang y estan implementados en la clase Thread.

El lanzamiento y la ejecución de un hilo son más económicos que los de un proceso (hilos --- procesos ligeros).
Programación concurrente (threads) Julio, 2002

Y=getSize(). newTime.width.Ejemplo del Applet AnimaBola public class AnimaBola extends Applet implements ActionListener { Color color.Y. } public void start(){ while (true){ X=getSize(). add(boton). color = getBackground().addActionListener(this). Circulo c. 2002 .70). //Ralentizamos el movimiento controlando el tiempo de reloj newTime = System. } } } Programación concurrente (threads) Julio. long time. boton. Button boton.height. int X.currentTimeMillis(). boton=new Button("Boton"). repaint(). if (newTime-time>10){ time=newTime. c=new Circulo(125. public void init() { setVisible(true).

"L"). i++) { System. i< dist."T").out. laTortuga.currentTimeMillis().unican. miVelocidad= vel. } System. } public void corre(int dist) { for (int i= 0.out.currentTimeMillis()<l+1000*segundos){. 2002 . public static void main (String arg []) { laLiebre= new Animal(3. } public void espera (double segundos) { long l=System.corre(10)./miVelocidad).corre(10).Carrera: La tortuga y la liebre class Carrera { static Animal laLiebre. laTortuga= new Animal(1. String nom) { miNombre= nom.laTortuga. }} class Animal { double String miVelocidad. TTTTTTTTTT T ha llegado LLLLLLLLLL L ha llegado public Animal (double vel. //metros por segundo miNombre. espera(1.print (miNombre). while (System.es/macc/asignaturas/javaDB Programación concurrente (threads) Julio.println ("\n" + miNombre + " ha llegado\n").} } } http://grupos. laLiebre.

start(). 2002 . class Ejec implements Runnable { . t.. public void run() {. Interfases) Heredando directamente de la clase Thread y redefiniendo run() ? Mediante una clase que implemente la interfase Runnable. } Ejec h = new Ejec ()..Definición de Hilos (herencia vs. } PROBLEMA: En ese caso el hilo no puede heredar de ninguna otra clase.. Thread t = new Thread(h)... implements Runnable { Thread () Thread (Runnable target) Julio. class Hilo extends Thread { . public void run() {.. CONSTRUCTORES: Programación concurrente (threads) class Hilo extends . h..start().... hay que definir run() ? Hilo h = new Hilo()...} ...} .

} TLLLLLTLLLLL L ha llegado TTTTTTTT T ha llegado public void run() { for (int i= 0.out.corre(10). laTortuga= new AnimalT(1. miVelocidad= vel./miVelocidad).laTortuga. private int dist.corre(10). public AnimalT (double vel. String nom) { miNombre= nom.currentTimeMillis()<l+1000*segundos){."T"). while (System. start().} } public void corre(int distancia) { dist=distancia. i< dist.println ("\n" + miNombre + " ha llegado\n"). }} class AnimalT extends Thread{ double miVelocidad. public static void main (String arg []) { laLiebre= new AnimalT(3. //metros por segundo String miNombre. i++) { System.currentTimeMillis().print (miNombre). } System. 2002 . } public void duerme (double segundos) { long l=System. laLiebre. } } Programación concurrente (threads) Julio.out.Carrera en paralelo: La tortuga y la liebre class CarreraT { static AnimalT laLiebre."L"). laTortuga. duerme(1.

2002 . laLiebre= new AnimalT ( 5. run(). ? No Ejecutable (o bloqueado): laLiebre.start(). o ya ha muerto. cede su derecho de ejecución a otro hilo isAlive() Permite conocer si un hilo está activo/dormido o si no ha sido creado. durante el lapso de tiempo indicado el hilo no consume recursos. ? Muerto: cuando ha terminado los procesos indicados en el método run (muere automáticamente).sleep(10).yield(). ? run() Muerto Ejecutable (o activo) : laLiebre.Estados de un Hilo new Thread() run() ? yield() sleep() No Ejecutable Nuevo: Nuevo start() Ejecutable static AnimalT laLiebre. el sistema le asigna regularmente un lapso de tiempo. laLiebre. " L" ). Programación concurrente (threads) Julio.

laTortuga. laTortuga= new AnimalT(1. public static void main (String arg []) { laLiebre= new AnimalT(3. String nom) { miNombre= nom. }} class AnimalT extends Thread{ double miVelocidad.sleep(5000). Thread. Thread. //metros por segundo String miNombre. private int dist.out.corre(10). } System. laLiebre. start()."T")."L"). laTortuga.corre(10).corre(10).Ventaja para la Tortuga.print (miNombre).sleep(5000). public AnimalT (double vel. } } public static void sleep(long millis) throws InterruptedException Programación concurrente (threads) Julio.out. miVelocidad= vel. Métodos Propios de Hebras class CarreraT2 { static AnimalT laLiebre. laLiebre. } public void run() { for (int i= 0. i< dist. } public void corre(int distancia) { dist=distancia.laTortuga. 2002 .corre(10). sleep((long) (1000/miVelocidad)). i++) { System.println ("\n" + miNombre + " ha llegado\n").

puede generar una excepción del tipo IlegalThreadStateException si se llama a un método distinto del start( ). hemos de esperar a su terminación para poder finalizar el hilo en curso. El método sleep( ) puede generar la excepción InterruptedException Si algún otro hilo le interrumpe.Control de Excepciones en Hilos Un hilo nuevo. 2002 . Programación concurrente (threads) Julio. Una vez arrancado un hilo hilo.start().

"T"). } } System. InterruptedException { No podemos "pasar" la excepción pues sería incompatible con run() heredado de Thread. public static void main (String arg []) throws laLiebre= new AnimalT(3.println ("\n" + miNombre + " ha llegado\n"). start(). public AnimalT (double vel. 2002 . Thread. i< dist. miVelocidad= vel. } } Programación concurrente (threads) Julio. }} class AnimalT extends Thread{ double miVelocidad. private int dist. laTortuga= new AnimalT(1."L"). //metros por segundo String miNombre.sleep(5000).out.corre(10). laTortuga. } public void corre(int distancia) { dist=distancia.out.Controlando las Excepciones class CarreraT3 { static AnimalT laLiebre.print (miNombre). String nom) { miNombre= nom. i++) { System. } public void run() { for (int i= 0. try{ sleep((long) (1000/miVelocidad)). } catch (Exception e) { .corre(10). laLiebre.laTortuga.

setPriority( int p). 2002 .Prioridades ¿Con qué prioridades trabaja Java? Algoritmo de programación fija: se ejecuta siempre primero el hilo de mayor prioridad Algoritmo de programación preemptivo: si un hilo de mayor prioridad que el que se esta ejecutando pasa al estado ejecutable el sistema elige este nuevo hilo para comenzar su ejecución. Permite a un hilo ceder su derecho de ejecución. Programación concurrente (threads) Julio. 1? p? 10 Permite modificar la prioridad de un hilo yield( ).

Void run (){ c. 2002 .. } } Programación concurrente (threads) Julio.cuenta() de un mismo objeto. class Objeto { . Prueba(Objeto obj){c=obj}. Esto puede dar lugar a resultados absurdos al mezclarse las operaciones de ambos hilos.Compartición de datos (sincronismo) Puede ocurrir que dos hilos compartan simultáneamente la ejecución de un método objeto. Para evitar ésto se puede declarar el método como Synchornized. permitiendo que un único hilo pueda ejecutar el método simultáneamente. Synchornized void cuenta() {} } class Prueba extends Thread { Objeto c..cuenta().