Capítulo IX: Hilos Los procesadores y los Sistemas Operativos modernos permiten la multitarea, es decir, la realización simultánea de dos o más

actividades (al menos aparentemente). En la realidad, un ordenador con una sola CPU no puede realizar dos actividades a la vez. Sin embargo los Sistemas Operativos actuales son capaces de ejecutar varios programas "simultáneamente" aunque sólo se disponga de una CPU: reparten el tiempo entre dos (o más) actividades, o bien utilizan los tiempos muertos de una actividad (por ejemplo, operaciones de lectura de datos desde el teclado) para trabajar en la otra. En ordenadores con dos o más procesadores la multitarea es real, ya que cada procesador puede ejecutar un hilo o thread diferente. La Figura tomada del Tutorial de Sun, muestra los esquemas correspondientes a un programa con uno o dos hilos.

Los métodos de la clase Thread: currentThread: Representa al hilo que esta ejecutándose en ese momento. yield: Asegura que los hilos de menor prioridad no sufran inanición. sleep: milisegundos. Pone a dormir al hilo en curso durante n

start: Crea un hilo de sistema y ejecuta. Luego llama al método run. run: método start. stop: Es el cuerpo del hilo. Es llamado por el Provoca la destrucción del hilo.

suspend: Detiene el hilo, pero no lo destruye. Puede ejecutarse de nuevo. resume: setName: getName: setPriority() getPriority: Para revivir un hilo suspendido. Asigna un nombre al hilo en curso. Devuelve el nombre del hilo en ejecución. Establece la prioridad del hilo. De 1 a 10. Devuelve la prioridad del hilo en curso.

Ejemplo 9.11 1 public class ContadorAdelante extendsThread { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public ContadorAdelante(String nombre) // constructor { if (nombre != null) setName(nombre); start(); //el hilo ejecuta su propio método run } public ContadorAdelante() { this(null); } // constructor public voidrun() { for (inti=1; i<=1000; i++) System.out.print(getName() + " "+i+"\r"); System.out.println(); } }

1 public classTestHilo 2 { 3 public static void main(String []args) 4 { 5 ContadorAdelante cuentaAdelante = new 6 ContadorAdelante("Contador+"); 7 }
1Tomado de Guión de clases Programación III. Inga. Patricia Estrada. Universidad de El Salvador. Año 2006.

8 } El operador new crea un hilo cuentaAdelante (el hilo está en el estado nuevo). El método start cambia el estado del hilo a preparado. De ahora en adelante y hasta que finalice la ejecución del hilo cuentaAdelante, será el planificador de hilos el que determine cuando éste pasa al estado de ejecución y cuando lo abandona para permitir que se ejecuten simultáneamente otros hilos. El método start no hace que se ejecute inmediatamente el método run del hilo, sino que lo sitúa en el estado preparado para que compita por la UCP junto con el resto de los hilos que haya en este estado. Solo el planificador puede asignar tiempo de UCP a un hilo y lo hará con cuentaAdelante en cualquier instante después de que haya recibido el mensaje start. Por lo tanto, un hilo durante su tiempo de vida, gasta parte de él en ejecutarse y el resto en alguno de los otros estados. Lo que no se debe hacer es llamar directamente al método run; esto ejecutaría el código de este método sin que intervenga el planificador. Quiere esto decir que es el método start el que registra el hilo en el planificador de hilos. Ejemplo 9.22 Dos hilos se crean utilizando el método setPriority con dos niveles de prioridad distintos. Se inician ambos y se les permite la ejecución durante 10 segundos. Cada hilo gira en torno a un bucle que cuenta cuantas veces se ejecuto el mismo. class pulso implements Runnable{ int pulsa=0; private Thread hilo; private boolean corre=true;

public pulso(int p){ hilo=new Thread(this);
2Tomado de Programación en Java. Ing. Frank Mora Rodríguez

hilo.setPriority(p); }

public void run(){ while(corre){ pulsa++; } } public void stop(){ corre=false; } public void start(){ hilo.start(); } }

class hilos{ public static void main(String args[]){ Thread.currentThread().setPriority(Thread.MAX_PRIORITY); pulso h1=new pulso(Thread.NORM_PRIORITY+2); pulso h2=new pulso(Thread.NORM_PRIORITY-2);

h1.start(); h2.start();

try{Thread.sleep(10000);} catch(Exception e){} h1.stop(); h2.stop();

System.out.println(h1.pulsa+" contra "+h2.pulsa); } }