Você está na página 1de 11

Procesos Paralelos en Java

Ejemplo de Applet (animabola)

Los sistemas operativos realizan en "paralelo" diversos procesos, repartiendo el tiempo de CPU segn 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 ejecucin de un hilo son ms econmicos que los de un proceso (hilos --- procesos ligeros).
Programacin concurrente (threads) Julio, 2002

Ejemplo del Applet AnimaBola


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

Programacin concurrente (threads)

Julio, 2002

Carrera: La tortuga y la liebre


class Carrera { static Animal laLiebre,laTortuga; public static void main (String arg []) { laLiebre= new Animal(3,"L"); laTortuga= new Animal(1,"T"); laTortuga.corre(10); laLiebre.corre(10); }} class Animal { double String miVelocidad; //metros por segundo miNombre;

TTTTTTTTTT T ha llegado LLLLLLLLLL L ha llegado

public Animal (double vel, String nom) { miNombre= nom; miVelocidad= vel; } public void corre(int dist) { for (int i= 0; i< dist; i++) { System.out.print (miNombre); espera(1./miVelocidad); } System.out.println ("\n" + miNombre + " ha llegado\n"); } public void espera (double segundos) { long l=System.currentTimeMillis(); while (System.currentTimeMillis()<l+1000*segundos){;} } }

http://grupos.unican.es/macc/asignaturas/javaDB
Programacin concurrente (threads) Julio, 2002

Definicin de Hilos (herencia vs. Interfases)


Heredando directamente de la clase Thread y redefiniendo run()
?

Mediante una clase que implemente la interfase Runnable; hay que definir run()
?

Hilo h = new Hilo(); h.start(); class Hilo extends Thread { ... public void run() {...} ... }

Ejec h = new Ejec (); Thread t = new Thread(h); t.start(); class Ejec implements Runnable { ... public void run() {...} ... }

PROBLEMA: En ese caso el hilo no puede heredar de ninguna otra clase. CONSTRUCTORES:
Programacin concurrente (threads)

class Hilo

extends ...

implements Runnable {

Thread () Thread (Runnable target)


Julio, 2002

Carrera en paralelo: La tortuga y la liebre


class CarreraT { static AnimalT laLiebre,laTortuga; public static void main (String arg []) { laLiebre= new AnimalT(3,"L"); laTortuga= new AnimalT(1,"T"); laTortuga.corre(10); laLiebre.corre(10); }} class AnimalT extends Thread{ double miVelocidad; //metros por segundo String miNombre; private int dist; public AnimalT (double vel, String nom) { miNombre= nom; miVelocidad= vel; }

TLLLLLTLLLLL L ha llegado TTTTTTTT T ha llegado

public void run() { for (int i= 0; i< dist; i++) { System.out.print (miNombre); duerme(1./miVelocidad); } System.out.println ("\n" + miNombre + " ha llegado\n"); } public void duerme (double segundos) { long l=System.currentTimeMillis(); while (System.currentTimeMillis()<l+1000*segundos){;} } public void corre(int distancia) { dist=distancia; start(); } }

Programacin concurrente (threads)

Julio, 2002

Estados de un Hilo
new Thread()

run()
?

yield() sleep() No Ejecutable

Nuevo:

Nuevo

start()

Ejecutable

static AnimalT laLiebre; laLiebre= new AnimalT ( 5, " L" );


?

run() Muerto

Ejecutable (o activo) :
laLiebre.start(); run(); el sistema le asigna regularmente un lapso de tiempo.

No Ejecutable (o bloqueado):
laLiebre.sleep(10); durante el lapso de tiempo indicado el hilo no consume recursos. laLiebre.yield(); cede su derecho de ejecucin a otro hilo

isAlive()
Permite conocer si un hilo est activo/dormido o si no ha sido creado, o ya ha muerto.

Muerto:
cuando ha terminado los procesos indicados en el mtodo run (muere automticamente).
Programacin concurrente (threads)

Julio, 2002

Ventaja para la Tortuga. Mtodos Propios de Hebras


class CarreraT2 { static AnimalT laLiebre,laTortuga; public static void main (String arg []) { laLiebre= new AnimalT(3,"L"); laTortuga= new AnimalT(1,"T"); laTortuga.corre(10); Thread.sleep(5000); laLiebre.corre(10); }} class AnimalT extends Thread{ double miVelocidad; //metros por segundo String miNombre; private int dist; public AnimalT (double vel, String nom) { miNombre= nom; miVelocidad= vel; } public void run() { for (int i= 0; i< dist; i++) { System.out.print (miNombre);

laTortuga.corre(10); Thread.sleep(5000); laLiebre.corre(10);

sleep((long) (1000/miVelocidad));
} System.out.println ("\n" + miNombre + " ha llegado\n"); } public void corre(int distancia) { dist=distancia; start(); } }

public static void sleep(long millis) throws InterruptedException Programacin concurrente (threads) Julio, 2002

Control de Excepciones en Hilos


Un hilo nuevo, puede generar una excepcin del tipo IlegalThreadStateException si se llama a un mtodo distinto del start( ). Una vez arrancado un hilo hilo.start(); hemos de esperar a su terminacin para poder finalizar el hilo en curso. El mtodo sleep( ) puede generar la excepcin InterruptedException Si algn otro hilo le interrumpe.

Programacin concurrente (threads)

Julio, 2002

Controlando las Excepciones


class CarreraT3 { static AnimalT laLiebre,laTortuga; public static void main (String arg []) throws laLiebre= new AnimalT(3,"L"); laTortuga= new AnimalT(1,"T"); laTortuga.corre(10); Thread.sleep(5000); laLiebre.corre(10); }} class AnimalT extends Thread{ double miVelocidad; //metros por segundo String miNombre; private int dist; public AnimalT (double vel, String nom) { miNombre= nom; miVelocidad= vel; } public void run() { for (int i= 0; i< dist; i++) { System.out.print (miNombre);

InterruptedException {

No podemos "pasar" la excepcin pues sera incompatible con run() heredado de Thread.

try{ sleep((long) (1000/miVelocidad)); } catch (Exception e) { ; }


} System.out.println ("\n" + miNombre + " ha llegado\n"); } public void corre(int distancia) { dist=distancia; start(); } }

Programacin concurrente (threads)

Julio, 2002

Prioridades
Con qu prioridades trabaja Java?

Algoritmo de programacin fija: se ejecuta siempre


primero el hilo de mayor prioridad

Algoritmo de programacin 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 ejecucin.

setPriority( int p); 1? p? 10


Permite modificar la prioridad de un hilo

yield( );
Permite a un hilo ceder su derecho de ejecucin.

Programacin concurrente (threads)

Julio, 2002

Comparticin de datos (sincronismo)


Puede ocurrir que dos hilos compartan simultneamente la ejecucin de un mtodo objeto.cuenta() de un mismo objeto. Esto puede dar lugar a resultados absurdos al mezclarse las operaciones de ambos hilos. Para evitar sto se puede declarar el mtodo como Synchornized, permitiendo que un nico hilo pueda ejecutar el mtodo simultneamente.
class Objeto { ... Synchornized void cuenta() {} } class Prueba extends Thread { Objeto c; Prueba(Objeto obj){c=obj}; Void run (){ c.cuenta(); } }
Programacin concurrente (threads) Julio, 2002

Você também pode gostar