PROGRAMACION CONCURRENTE (THREAD) parte I
Septiembre 7, 2007
PROGRAMACION CONCURRENTE (THREAD) con ejemplos.
Parte I/II
Los thread (hilos) de java permiten ejecutar en paralelo varios programas que se encuentran en la misma aplicación.
Existen 2 formas de definir una clase para que pueda ejecutarse en paralelo a otras clases:
· Extendiendo la clase thread
· Implementando la interfaz Runnable.
Ejemplo:
public class SeEjecutaConcurrentemente extends Thread
public class SeEjecutaConcurrentemente implements Runnable
Puesto que Java no soporta herencia múltiple, si necesitemos heredar los miembros de una clase resuta necesario hacer uso de la interfaz Runnable; por ejemplo si desearamos crear un applet que se ejecute concurrentemente con otros programas, podemos definir nuestra clase como:
Public classAppletConcurrente extends java.applet.Applet implements Runnable
La interfaz Runnable es extremadamente sencillo: unicamente contiene el metodo run(). Cuando un Objeto que implementa esta interfaz se usa para crear n metodo thread, al arrancar el thread se ejecuta automáticamente el metodo run.
La Clase Thread que implementa la interfaz Runnable y contiene un variado grupo de constructores y metodos que permiten definir el comportamiento y evolucion de los programas concurrentes.
Las estructuras más simples de programas que usan Threads son:
Empleando la clase Thread:
———————————————————————————
Class TelefonoEnvia extends Thread {
……//propiedades, constructores y metodos de la clase
Public void run() {
……….//recoge sonidos del micrófono y envia por la red
}
}
Para crear y arrancar un thread con el comportamiento de TelefonoEnvia:
TelefonoEnvia InstanciaEnvia = new TelefonoEnvia();
InstanciaEnvia.start();
Implementando la interfaz Runnable:
Class Telefonoenvia implements Runnable {
………. // propiedades,contructores y metodos de la clase
Public void run() {
//recoge sonidos delmicrofono y los envia por la red
}
}
Para crear y arrancar un thread con el comportamiento de TelefonoEnvia:
TelefonoEnvia InstanciaEnvia = new TelefonoEnvia();
New Thread(InstanciaEnvia).start();
Como se puede apreciar en las estructuras de programa mostradas, para arrancar un Thread debemos utilizar el método start, que a su vez provoca la ejecución del método run, En la ultima línea de código mostrada, se utiliza un constructor de la clase Thread que admite un objeto Runnable como parámetro.
Un método importante de la clase Thread que debemos conocer es:
Static void sleep (long milisegundos) // detiene la ejecución del Thread al menos en el numero de milisegundos indicado.
PRIMER EJEMPLO
Este primer ejemplo hace uso de dos Threads; cada Thread imprime una frase en momentos diferentes.
La clase ThreadBasico implementa la interfaz Runnable, y por tanto su unico método run. Cada instancia de la clase ThreadBasico incorpora las propiedades Frase y Aleatorio, que contendrán el String a imprimir y una medida del tiempo que se tardará en hacerlo.
El String a imprimir le llega a la clase a través de su constructor. La propiedad Aleatorio contiene el valor numérico que le proporciona la clase Random.
El método run (que se invoca automáticamente tras el método start) imprime la frase por consola y se duerme durante un tiempo aleatorio.
Estas acciones se repiten indefinidamente en un bucle. El bloque “try catch” resulta necesario para contemplar en caso de que nuestro thread sea interrumpido.
Import java.util.Random;
Public class ThreadBasico implements Runnable {
private String Frace;
private Random Aleatorio;
public ThreadBasico (String Frase) {
this.Frase = Frase;
Aleatorio = new Random();
} // fin constructor
public void run() {
try {
do {
System.out.println(Frase);
Thread.sleep( (long) (Math.abs(Aleatorio.nextInt() ) % 500) );
} while (trae);
} catch (InterruptedException e) {}
} // fin run
} //fin class
Para probar el comportamiento de la clase ThreadBasico se proporciona la clase ThreadBasicoMain, donde se crean dos instancias de ThreadBasico. Cada instancia recibe una palabra de la consola a través del parámetro de tipo String[] del método main; de esa manera, tecleando en consola el comando de ejecución.
Ej “c:\misEjemplosJava\java ThreadBasicoMain uno dos”, en arg[0] recogemos el valor “uno” y en args[1] el valor “dos”.
Se Arrancan los 2 threads instanciados, lo que provoca la ejecución del metodo run de ambas instancias.
Public class ThreadBasicoMain {
Public static vpid main (String[] args) {
Thread PrimerHilo = new Thread ( new ThreadBasico (args[0]) );
Thread SegundoHilo = new Thread ( new ThreadBasico (args[1]) );
PrimerHilo.start();
SegundoHilo.start();
}
}// end class
Eso es todo, hasta luego.
Diciembre 24, 2008 at 1:59 am
well, hi admin adn people nice forum indeed. how’s life? hope it’s introduce branch