Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introduccin
Qu es un Hilo o Thread?
Es un proceso individual que comparte recursos con otros hilos de un programa multihilo.
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) );
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 } }
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
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 ) {;} } } }
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.