Вы находитесь на странице: 1из 20

Hilos en Java

Introduccin
Qu es un Hilo o Thread?
Es un proceso individual que comparte recursos con otros hilos de un programa multihilo.

Diferencias entre multihilo y multiproceso


Multiproceso
Varios procesos que se ejecutan (aparentemente) a la vez bajo el control del sistema operativo. Los procesos no tienen porque tener relacin uno con otros.

Multihilo
Dos tareas se ejecutan (aparentemente) a la vez dentro de un mismo programa. programa El programador debe planificar adecuadamente cada hilo.

Programas Multihilo
La sincronizacin entre las mltiples partes de un programa se llevaba a cabo mediante un bucle de suceso nico. Los navegadores son programas multihilo que ejecutan diferentes tareas a la vez, como por ejemplo la ejecucin de varios applets a la vez, etc.

Programas Multihilo g
Ejemplo MultiHolaMundo.java
class MultiHola extends Thread { private String nombre; private int retardo; // Constructor para almacenar nuestro nombre // y el retardo public MultiHola( String s,int d ) { nombre = s; retardo = d; } // El metodo run() es similar al main(), pero para // threads. Cuando run() termina el thread muere public void run() { // Retasamos la ejecucin el tiempo especificado try { y sleep( retardo ); } catch( InterruptedException e ) {;} // Ahora imprimimos el nombre System.out.println( Hola System out println( "Hola Mundo! "+nombre+" "+retardo ); +nombre+ +retardo } }

Programas Multihilo
Ejemplo MultiHolaMundo.java

public class MultiHolaMundo { public static void main( String args[] ) { MultiHola t1,t2,t3; // t1 t2 t3 Creamos los threads = new MultiHola( "Thread 1",(int)(Math.random()*200) ); = new MultiHola( "Thread 2",(int)(Math.random()*10000) ); = new MultiHola( "Thread 3",(int)(Math.random()*2000) );

// Arrancamos los threads t1.start(); t2.start(); t3.start(); } }

La clase java.lang.Thread
Es la clase que encapsula todo el control necesario sobre los hilos de ejecucin (threads). Hay que distinguir claramente un objeto Thread de un hil d ejecucin. hilo de j i Cada hilo tiene una prioridad que indica la preferencia d ejecucin con respecto a otros hil f i de j i t t hilos. daemon es un tipo de hilo especial con una prioridad muy baja que se suelen dedicar a dar baja, servicios, como el recolector de basura.

La clase java.lang.Thread j g
Mtodos de la clase
Mtodo Thread currentThread() void yield() void sleep(long ) void start() void stop() void suspend() void resume() boolean isAlive() void setPriority( int ) void getPriority() id tP i it () void setName( String ) String getName() ( ) void setDaemon(boolean) Boolean isDaemon() String toString() Significado Devuelve el hilo que se est ejecutando actualmente. Para el hilo actual y permite que otros hilos se puedan ejecutar. Duerme al hilo durante los milisegundos indicados y luego continua. Comienza la ejecucin de un hilo, llamando a su mtodo run(). Provoca que el hilo detenga su ejecucin y no pueda continuar ms, ya que el hilo muere. Detiene la ejecucin del hilo sin destruirlo. Continua con la ejecucin de un hilo detenido anteriormente. Comprueba si el hilo esta vivo, es decir, ha sido creado y no ha muerto todava. Asigna la prioridad indicada al hilo, un valor entero entre 1 y 10. La prioridad normal es 5. Devuelve l prioridad del hilo. D l la i id d d l hil Cambia el nombre que tiene asignado el hilo. Devuelve el nombre del hilo. Indica si el hilo a crear va a ser un daemon o no. Comprueba si el hilo es un daemon. Devuelve una cadena con el nombre del hilo, su prioridad y grupo.

Creacin de Hilos
Existen dos formas de crear un hilo
Extendiendo la clase java.lang.Thread
Tipo class ClaseHilo extends Thread { public void run() { Cdigo Ejecucin Del Hilo } }

Implementando el interface java.lang.Runnable


Tipo class ClaseHilo implements Runnable { public void run() {Cdigo Ejecucin Del Hilo } }

Ejemplo j p
HiloTipoImplements.java
class HiloTipoImplements{ static public void main( String args[] ) { Thread hiloA = new Thread( new MiHilo1(),"hiloA" ); Thread hiloB = new Thread( new MiHilo(),"hiloB" ); hiloA.start(); hiloB.start(); hiloB start(); try { Thread.currentThread().sleep( 1000 ); } catch( InterruptedException e ){} System.out.println( Thread.currentThread() ); } } class MiHilo1 extends Thread { public void run() { System.out.println( Thread currentThread() System out println( Thread.currentThread() ); } }

Ejemplo j p
HiloTipoImplements.java
class HiloTipoImplements { static public void main( String args[] ) { Thread hiloA = new Thread( new MiHilo1(),"hiloA" ); ( (), Thread hiloB = new Thread( new MiHilo(),"hiloB" ); hiloA.start(); hiloB.start(); try { Thread.currentThread().sleep( 1000 ); } catch( InterruptedException e ){} System.out.println( Thread currentThread() System out println( Thread.currentThread() ); }

Ejemplo j p
HiloTipoImplements.java
class MiHilo1 extends Thread { public void run() { System.out.println( Thread.currentThread() ); } } class MiHilo extends implements Runnable { public void run() { System.out.println( Thread.currentThread() ); System.out.println("Hilo:"+ Thread.currentThread()); } }

Ejemplo j p
Contador.java
import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class Contador extends Applet implements Runnable { Thread t; int contador; public void i it() { bli id init() ProcesoRaton procesoRaton = new ProcesoRaton(); addMouseListener( procesoRaton ); contador = 0; t = new Thread( this ); t.start(); } public void run() { Thread miThread = Thread.currentThread(); (); while( t == miThread ) { contador++; repaint(); try { miThread.sleep( miThread sleep( 10 ); } catch( InterruptedException e ) {;}; } } public void paint( Graphics g ) { g.drawString( Integer.toString( contador ),10,10 ); System.out.println( "Contador= "+contador ); }

class ProcesoRaton extends MouseAdapter { public void mousePressed( MouseEvent evt ) { t = null; } } }

Fichero Contador.html
<html> <body> <APPLET CODE="Contador.class" WIDTH=100 HEIGHT=50> </APPLET> </body> </html>

Estados de un Hilo
yield() sleep() suspend() wait() Parado resume() notify() stop() Muerto

Creado

start()

Ejecucin j

stop() exit() () stop()

Sincronizacin entre hilos


La comunicacin entre hilos se hace a travs de objetos comunes. comunes Puede aparecer el problema del interbloqueo. Para evitarlo se d fi P it l definen zonas crticas utilizando metodos ti tili d t d synchronized, y semforos con varibles utilizando los metodos wait y notify. El ejemplo clsico de comunicacin de hilos de ejecucin es un modelo productor/consumidor.

Sincronizacin entre Hilos


Ejemplo ProductorConsumidor.java
class Productor extends Thread { private Tuberia tuberia; private String alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public Productor( Tuberia t ) { // Mantiene una copia propia del objeto compartido tuberia = t; } public void run() { char c; // Mete 10 letras en la tubera for( int i=0; i < 10; i++ ) { c = alfabeto charAt( (int)(Math random()*26 ) ) alfabeto.charAt( (int)(Math.random()*26 ); tuberia.lanzar( c ); // Imprime un registro con lo aadido System.out.println( "Lanzado "+c+" a la tuberia." ); // Espera un poco antes de aadir ms letras try { sleep( (int)(Math.random() * 100 ) ); } catch( InterruptedException e ) {; } } } }

Sincronizacin de Hilos
Ejemplo ProductorConsumidor.java
class C l Consumidor extends Thread id d h d { private Tuberia tuberia; public C bli Consumidor( T b i t ) { id ( Tuberia // Mantiene una copia propia del objeto compartido tuberia = t; } public void run() { char c; // Consume 10 letras de la tubera for( int i=0; i < 10; i++ ) { c = tuberia.recoger(); // Imprime las letras retiradas System.out.println( "Recogido el caracter "+c ); // Espera un poco antes de coger ms letras try { sleep( (int)(Math.random() * 2000 ) ); } catch( InterruptedException e ) {;} } } }

Sincronizacin entre Hilos


Ejemplo ProductorConsumidor.java
class Tuberia { private char buffer[] = new char[6]; private int siguiente = 0; // Flags para saber el estado del buffer private boolean estaLlena = false; private boolean estaVacia = true; // Mtodo para retirar letras del buffer public synchronized char recoger() { // N se puede consumir si el b ff No d i i l buffer est vaco t while( estaVacia == true ) { try { wait(); // Se sale cuando estaVacia cambia a false } catch( InterruptedException e ) {;} } // Decrementa la cuenta, ya que va a consumir una letra siguiente--; // C Comprueba si se retir l l i b i i la ltima l letra if( siguiente == 0 ) estaVacia = true; // El buffer no puede estar lleno, porque acabamos de consumir ; estaLlena = false; notify(); // Devuelve la letra al thread consumidor return( buffer[siguiente] ); }

Hilos
// Mtodo para aadir letras al buffer public synchronized void lanzar( char c ) { // Espera hasta que haya sitio para otra letra while( estaLlena == true ) { try { wait(); // Se sale cuando estaLlena cambia a false } catch( InterruptedException e ) {;} } // Aade una letra en el primer lugar disponible buffer[siguiente] = c; // Cambia al siguiente lugar disponible siguiente++; // Comprueba si el buffer est lleno if( siguiente == 6 ) estaLlena = true; estaVacia = false; notify(); } } // Fin clase Tubera

Hilos
class ProductorConsumidor { public static void main( String args[] ) { Tuberia t = new Tuberia(); Productor p = new Productor( t ); Consumidor c = new Consumidor( t ); p.start(); c.start(); c start(); } }

Grupos de Hilos
La clase ThreadGroup define e implementa la capacidad de un grupo de hilos hilos. Permiten que sea posible recoger varios hilos de ejecucin en un solo objeto y manipularlo como un grupo, en vez de individualmente. individualmente Cuando se crea un nuevo hilo, se coloca en un grupo, bien indicndolo explcitamente, o bien dejando que el sistema lo coloque en el grupo por defecto defecto. Una vez creado el hilo y asignado a un grupo, ya no se podr cambiar a otro grupo. Si no se especifica se aade al grupo main, que se crea cuando se arranca una aplicacin.

Вам также может понравиться