Dotando a la clase ancestral Object de los mtodos Wait(), Notify() y NotifyAll() que dan soporte a los
eventos
Asociando un lock a cada clase y a cada objeto, la obtencin y la devolucin del lock se hace mediante la
utilizacin de la palabra reservada synchronized mediante la cual se definen mtodos o bloques de cdigo a
los que se accede en exclusin mutua
Proporcionando la clase Thread en la librera java.lang que implementa los mecanismos bsicos para realizar
hilos
La interfaz Runnable permite la creacin de hilos en clases que extienden otra clase diferente de Thread
El control de prioridad
CCP
Tanto Thread como Runnable forman parte de java.lang con lo que no requieren ser importados explcitamente.
Ambos mtodos tienen en comn el procedimiento bsico que consiste en implementar el mtodo run(). El mtodo para iniciar el hilo depende de la forma como se halla creado:
Extendiendo la clase Thread Se llama al mtodo start de los objetos que instancian la clase
Implementando Runnable Se crea un objeto Thread con el constructor que tiene como parmetro un objeto
Runnable y llamando posteriormente al mtodo start de dicho objeto
En las pginas 15-23 se dispone de un ejemplo en el que se incluye una animacin en un Applet utilizando los
dos mecanismos: una clase auxiliar que extiende Thread e implementando Runnable en el propio Applet.
isAlive Devuelve un valor true si el hilo esta activo, es decir su mtodo run ha sido iniciado con start y todava no ha finalizado
join Condiciona la continuacin del hilo actual a la terminacin de otro hilo, la duracin de esta espera se
puede limitar
setName y getName Permiten dar un nombre a un hilo y obtener dicho nombre, respectivamente. Esto tiene
inters sobre todo para la depuracin. La funcin setName se puede evitar utilizando los constructores adecuados de Thread (pag 30)
sleep Detiene la ejecucin del hilo que hace la llamada durante el tiempo que se especifica
currentThread Permite identificar al hilo que hace la llamada (ejemplo en la pgina 31)
enumerate Devuelve una matriz con referencias a todos los hilos creados por el programa (no necesariamente activos) y su nmero
activeCount Devuelve el nmero de hilos creados por el programa (no necesariamente activos)
CCP
Permite elegir el objeto cuyo lock se va a utilizar en la sincronizacin (no ha de ser necesariamente this)
Hay que evitar que el objeto cuyo lock se utiliza en synchonized sea null, y tambin tener cuidado ya que las referencias a objetos pueden cambiar en tiempo de ejecucin y por tanto los efectos sobre la sincronizacin pueden generar errores.
Los bloques de cdigo dentro de un mtodo esttico pueden sincronizarse haciendo uso del objeto mencionado:
public class Ejemplo {
void proceso() {
....
synchronized (Class.forName("Ejemplo")) {
.....
}
....
}
}
IV-A.3
CCP
Ambos mtodos han de llamarse desde cdigo sincronizado con el mismo lock para asegurar que el test de la
condicin y la entrada en espera se realizan en exclusin mutua. La funcin wait() libera el lock antes de iniciar
la espera y retoma el lock despus de recibir la notificacin.
En las pginas 67-68 se tiene una versin de un semforo con espera ocupada para la operacin get. La versin
con wait de la pgina 70 evita la espera ocupada y requiere sincronizar el mtodo. Obsrvese que wait est en un
bucle en el que despus de salir de wait se vuelve a testear la condicin.
4.2. NotifyAll
Cuando hay varios hilos en espera de la misma condicin no es posible saber cual de ellos recibir la notificacin.
El mtodo NotifyAll permite notificar a todos los hilos en espera que han utilizado el mismo lock, ser el mismo
lock que se ha utilizado para sincronizar el cdigo que incluye la llamada a NotifyAll.
En la pgina 75 se tiene la clase ResourceThrottle como ejemplo de utilizacin de NotifyAll. Todos los hilos
son notificados pero slo uno de los que demandan un nmero igual o menor de los recursos disponibles saldr
de la espera.
En las pginas 76-77 se tiene la clase TargetNotify que implementa un mecanismo de espera y notificacin selectivo.
La clase NumIntegralTh que es la clase principal con el mtodo main que lanza los hilos
IV-A.4
CCP
IV-A.5
CCP
return integral;
}
public void run() {
double h;
double local_a;
double local_b;
int local_n;
double integral;
h = (b - a)/(double)n;
local_n = n / p;
local_a = a + (double)id * local_n * h;
local_b = local_a + local_n * h;
integral = Trap (local_a, local_b, local_n, h);
res.update(integral);
}
}
5.5. Versin en C
#include <stdio.h>
#include <time.h>
#include <math.h>
double f(double x) {
double y;
y = log(sin(x*x+1));
y = sqrt(y*y);
return y;
}
int main(int argc, char* argv[]) {
double integral;
float a;
float b;
int n;
double h;
double x;
int i;
clock_t t0, t1;
float t;
a = 0.0; b = 0.0; n = 0;
printf ("Enter a, b and n\n");
scanf ("%f %f %d", &a, &b, &n);
printf ("of the integral from %f to %f\n", a, b);
t0 = clock();
h = ((double)b-(double)a)/(double)n;
integral = (f(a) + f(b)) / 2.0;
x = a;
for (i=1; i<n-1; i++) {
x = x + h;
integral = integral + f(x);
IV-A.6
CCP
}
integral = integral * h;
t1 = clock();
t = (float)((1000*t1)/CLOCKS_PER_SEC) - (float)((1000*t0)/CLOCKS_PER_SEC);
printf ("With n = %d trapezoids, our estimate\n", n);
printf ("of the integral from %f to %f = %20.20f\n", a, b, integral);
printf ("Tiempo = %f\n", t);
return 0;
}
Secuencial (C)
Secuencial (Java)
Paralelo
Origin 2000
7770
19588
4793
3620
1774
Bibliografa
Scott Oaks, Henry Wong "Java Threads" O'Reilly
Doug Lea "Concurrent Programming in Java: Design Principles and Patterns" Addison-Wesley
IV-A.7