Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion de Hilos PDF
Programacion de Hilos PDF
CAPITULO
12
Programacin de Hilos
Objetivos
Introduccin
En la naturaleza se presentan innumerables ejemplos de procesos que se
realizan de manera parela, simultneos o concurrentes. Por ejemplo, para el
caso del lector, los procesos que est realizando todo su cuerpo integral,
mientras realiza la accin consciente, de leer este prrafo. En el plano de los
sistemas artificiales, la concurrencia es un denominador comn, el computador,
la internet, los juegos, en los sistemas sofisticados de los automviles
modernos, las actuales comunicaciones inalambricas, etc.
Por tales razones, la concurrencia es un fenmeno importante de tratar, ya que
permite el desarrollo de sistemas capaces de adelantar, mltiples procesos
simultneamente. A su vez cada proceso se puede componer de mltiples
un hilo
dos hilos
Listo: Cuando se invoca el mtodo start() del hilo, se dice que est en
estado listo. El mtodo se arranca con la siguiente instruccin, para el caso
del hilo miHilo:
miHilo.start();
El mtodo stop() provoca una terminacin sbita del mtodo run() del hilo.
Si el mtodo run() estuviera realizando clculos sensibles, stop() podra
dejar el programa en un estado inconsistente. Normalmente, no se debera
La clase Thread
Como ya se ha establecido antes, un thread es un hilo de ejecucin de un
programa. La Maquina Virtual de Java (JVM) permite la ejecucin de
concurrente de mltiples hilos. En la clase Thread se encapsula todo el control
necesario sobre los hilos de ejecucin o tareas. Un objeto Thread se lo puede
entender como el panel de control sobre una tarea o hilo de ejecucin. Dispone
de mtodos para controlar el comportamiento de las tareas, los cuales se tratarn
ms adelante.
Los siguientes son los principales mtodos de Thread:
activeCount()
Retorna el mmero de el hilo activo en el grupo de
hilos.
void
checkAccess()
Chequea si eel hilo que se esta ejecutando tiene
permiso para modificar este hilo.
static Thr
ead
currentThread()
Retorna el objeto Thread que representa a la tarea
que se est ejecutando.
void
destroy()
Destruye la tarea actual.
String
getName()
Retorna el nombre actual del hilo, asignado con
setName().
int
getPriority()
Retorna un valor entre 1 y 10, correspondiente a la
prioridad de la tarea en ejecucin.
void
static boo
lean
getThreadGroup()
Retorna el grupo de hilo a que pertenece el hilo
actual.
interrupt()
Interrumpe el hilo.
interrupted()
Chequea si el hilo actual se ha interrumpido.
boolean
isAlive()
Chequea si el hilo esta vivo.
boolean
isDaemon()
Chequea si el hilo es un hilo de servicio a otros.
boolean
isInterrupted()
Chequea si el hilo ha sido interrumpido.
void
join()
Espera a que el hilo se muera.
void
join(long millis)
Espera hasta millis milisegundos para que el hilo
muera.
void
run()
Constituye el cuerpo de una tarea o hilo. Es
llamado por el mtodo start(), despues que la tarea
apropiada del sistema se haya inicializado. La tarea actual
se detendr cada vez que run() devuelva el control. Este es
el nico mtodo de la interfaz Runnable.
void
setDaemon(boolean on)
Marca este hilo como un hilo de servi iusuario o
hilo demonio.
void
setName(String name)
Permite asignarle a la tarea un nombre con el cual
se la puede identificar..
void
setPriority(int newPriority)
Cambia la prioridad de la tarea, entre los valores 1 y
10.
sleep(long millis)
Provoca que el intrprete de Java ponga la tarea a
dormir durante un tiempo indicado en milisegundos,
transcurrido dicho tiempo la tarea estar disponible para
ejecucin.
void
start()
Le indica al interprete de Java que cree un contexto
de ejecucin de una tarea e inicie su ejecucin. Acto
seguido se invoca el mtodo run() de esta tarea en el
nuevo contexto de ejecucin. Debe tenerse cuidado de
llamar a start() no ms de una vez para una tarea
determinada.
String
toString()
Retorna la cadena que representa el hilo, que
incluye nombre, prioridad y grupo del hilo.
static voi
d
yield()
Hace que el interprete detenga temporalmente la
ejecucin del objeto del hilo y permita que el siguiente
hilo disponible se ejecute.
Prioridades
El intrprete de Java utiliza prioridades, como valores enteros, para determinar
el trato que le debe dar a cada hilo respecto de los dems. La prioridad de un
hilo se utiliza para determinar cando se pasa a ejecutar otro hilo, lo cual se
denomina cambio de contexto de ejecucin. Hilos con alta prioridad se ejecutan
preferencialmente sobre hilos de menor prioridad.
La clase Thread tiene tres constantes predefinidas para asignar la prioridad:
MIN_PRIORITY (prioridad 1), NORM_PRIORITY (prioridad 5) y
MAX_PRIORITY (prioridad 10). Los procesos a nivel de usuario se
recomienda que tengan una prioridad alrededor de 5, tareas en segundo plano
as como de redibujo de la pantalla o entrada/salida por la red, con una prioridad
cercana a la minima.
Las reglas que determinan cuando se hace una conmutacin o cambio de
contexto son:
El hilo principal
Cuando la Maquina Virtual de Java arranca la ejecucin de un programa, ya hay
un hilo ejecutndose, denominado hilo principal del programa, que se ejecuta
cuando comienza el programa. Su importancia radica en que:
Debe ser el ltimo hilo que termine su ejecucin, ya que cuando este hilo
finaliza, el programa termina.
Creacin de hilos
El mtodo run() le permite a un hilo realizar su tarea, ya que su cdigo
implementa el comportamiento de ejecucin de la clase Thread, pudiendo
realizar cualquier operacin que sea codificable en instrucciones Java.
La clase Thread implementa un hilo genrico que por defecto no realiza nada,
es decir que, la implementacin de ese mtodo dentro de la clase es vaca. La
clase Thread (que es de por s un objeto Runnable) permite que un objeto
Runnable provea un mtodo run() ms interesante para los hilos. Hay dos
manera de crear hilos:
12 - 11
instancia de esta clase. Esta nueva clase debe sobreescribir el mtodo run de la
clase Thread que es el punto de entrada del nuevo hilo. Dentro de la clase que
utilice la instancia de la clase Thread, se debe llamar al mtodo start() para que
inicie la ejecucin del nuevo hilo.
La siguiente es la forma general del cuerpo de una clase hilo mediante extensin
de la clase Thread:
public class NombreClase extends Thread{
// clase que extiende a Thread
.....
public void run(){
// cuerpo para sobreescribir run()
.....
}
}
12 - 12
12 - 13
12 - 14
main()
main()
main()
main()
12 - 15
main()
main()
main()
main()
main()
12 - 16
}
}
main()
main()
main()
main()
main()
12 - 17
La siguiente forma general crea el hilo e inicia su ejecucin en la clase que usa a
MiClase:
MiClase miHilo = new MiClase();
new Thread(miHilo).start();
12 - 18
12 - 19
main()
main()
main()
main()
main()
12 - 20
try {
Thread.sleep(tiempo);
} catch (InterruptedException e) {
System.out.println("Interrupcion del hilo ");}
}
System.out.println("Termina hilo " );
unHilo= null;
}
}
public void paint(Graphics g){
g.drawString("Generacin enteros ",x,y);
}
}
12 - 21
12 - 22
Numero 7 en hilo 1
Numero 8 en hilo 1
valor i = 3 en Hilo principal en main()
Numero 9 en hilo 1
Termina hilo 1
valor i = 4 en Hilo principal en main()
Termina Hilo principal en main()
Exit code: 0
No Errors
java.awt.Graphics;
java.awt.Font;
java.util.Date;
java.applet.Applet;
12 - 23
La salida es la siguiente:
12 - 24
}
}
public void run() {
Thread thisThread = Thread.currentThread();
while (runner == thisThread ) {
for(int i=1; i <= 100;i++){
repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) { }
}
System.out.println("Termina hilo");
runner= null;
}
}
public void paint(Graphics g) {
}
}
12 - 25
12 - 26
animationThread.stop();
circles.removeAllElements();
}
}
repaint();
}
/* En cada iteracion se llama a paint() y se hace una pausa. El
mtodo paint(9 mueve los circulos y los dibuja */
public void run() {
while(true) {
repaint();
pause(100);
}
}
public void update(Graphics g) {
paint(g);
}
/* Borra cada circulo en su posicion anterior, lo mueve y lo
dibuja de nuevo en la nueva posicion */
public void paint(Graphics g) {
MovingCircle circle;
for(int i=0; i<circles.size(); i++) {
circle = (MovingCircle)circles.elementAt(i);
g.setColor(getBackground());
circle.draw(g); // vieja posicion
circle.move(width, height);
g.setColor(getForeground());
circle.draw(g); // nueva posicion
}
}
private int randomInt(int max) {
double x =
Math.floor((double)(max + 1) * Math.random());
return((int)(Math.round(x)));
}
// Duerme por un tiempo
private void pause(int milliseconds) {
try {
Thread.sleep((long)milliseconds);
} catch(InterruptedException ie) {}
}
}
import java.awt.*;
/* Clase para almacenar x, y, radius, con un mtodo de dibujo */
public class SimpleCircle {
12 - 27
12 - 28
setDeltaY(-deltaY);
}
public int getDeltaX() {
return(deltaX);
}
public void setDeltaX(int deltaX) {
this.deltaX = deltaX;
}
public int getDeltaY() {
return(deltaY);
}
public void setDeltaY(int deltaY) {
this.deltaY = deltaY;
}
}
<HTML>
<BODY BGCOLOR="WHITE"><H1>Circulos rebotando</H1>
<TABLE BORDER=5> <TR><TH>
<APPLET CODE="Bounce.class" WIDTH=600 HEIGHT=400> </APPLET>
</TABLE></BODY> </HTML>