| La fábula de la tortuga y la liebre |
| Forma 1: Operativa |
Un programa multihilo contiene dos o más partes
que pueden ejecutarse de forma concurrente.
- cada parte de ese programa se llama hilo (thread) y cada hilo establece
un camino de ejecución independiente.
- a partir del hilo principal se crean dos hilos más con diferentes prioridades y trabajando en paralelo.
- en este ejemplo se muestra como el Planificador de hilos de la MVJ va dando tiempo de procesador a cada uno de ellos.
- si uno de los dos hilos ha terminado, el otro hilo sigue en solitario junto con el Hilo principal.
El siguiente Diagrama de Clases de diseño muestra
la Jerarquía de los Threads
- java.lang.Runnable
- esta interfaz contiene un solo método llamado run()
- java.lang.Thread
- cuando invocamos al método start() de un Objeto de tipo Thread,
la MVJ automáticamente invoca al método run().
- el código del método run() implementa el comportamiento para el que fue creado el hilo. Es la razón de existir de éste.
- <<final>> +MAX_PRIORITY:int
<<final>> +MIN_PRIORITY:int
<<final>> +NORM_PRIORITY:int
- los hilos tienen un rango de prioridades de 1 hasta 10.
- si nosotros como desarrolladores no indicamos ninguna prioridad en corcreto la prioridad por defecto de los hilos es 5.
- todos los Sistemas Operativos van dando tiempo de procesador (quantums) a las diferentes aplicaciones que estan levantadas.
- por tanto si hay alguna aplicación Java ejecutánodose la MVJ recibe cíclicamnete tiempos de procesador
- estos quantums entonces los administra el Planificador de hilos de la MVJ y va repartiendo tiempos de ejecución al hilo principal y a los posibles subhilos que pudieran correr en paralelo al hilo principal
- el hecho de que la MVJ sea diferente en todas las plataformas puede causar que el comportamiento de una aplicación en una plataforma de desarrollo sea diferente al comportamiento de otra plataforma de explotación
- este hecho hace que las prioridades extremas como 1, 2, 9 y 10 haga que la aplicación tenga un comportamiento totalmente diferente si está corriendo en un entornos de desarrollo a uno de explotación.
- si por ejemplo se da una prioridad de 9 o 10 a un hilo y a otra prioridad de 1 o 2 a otro hilo, podría pasar que el hilo con la prioridad más baja apenas tenga tiempo de procesador
- para evitar esto es aconsejable que las prioridades estén entre 3 y 8
- por tanto el uso de las variables finales MAX_PRIORITY y MIN_PRIORITY no son muy aconsejables porque sus valores son 10 y 1 respectivamente son demasiado extremos..
Este es el Diagrama de Clases de diseño que muestra la primera forma de utilizar los hilos en Java

Nos tenemos que crear una pequeña aplicación que instancie dos corredores (laTortuga y laLiebre) que compitan conjuntamente con el hilo principal
- esta aplicación está formada por dos Clases
- la Clase FabulaApli1 que contiene el método main()
- la Clase Corredor1 que es el molde de las instancias laTortuga y laLiebre
Para ello nos podemos ayudar de los siguientes fragmentos de código Java
public Corredor1(String nombre) {
this.nombre = nombre;
}
|
public void run() {
for (int i = 0; i < 2000; i++){
System.out.print(nombre);
}
System.out.println("\n" + nombre + " ha llegado.");
}
|
public FabulaApli1() {
Corredor1 laTortuga = new Corredor1("T");
laTortuga.setPriority(5);
Corredor1 laLiebre = new Corredor1("L");
laLiebre.setPriority(5);
laTortuga.start();
laLiebre.start();
for (int i = 0; i < 2000; i++){
System.out.print("O");
}
System.out.println("\n O ha llegado.");
}
|