Hilos

 

  I.      Una computadora puede ejecutar varios procesos “simultáneamente” compartiendo el tiempo del CPU. Varios hilos (threads) pueden ejecutarse “simultáneamente” dentro de un mismo proceso. Esta técnica es llamada multiproceso o multihilo.

 

II.      Para controlar los hilos en Java se utilizan los siguientes métodos:

·        start para comenzar.

·        stop para parar

·        suspend para interrumpir temporalmente

·        resume para recomenzar un hilo que había estado suspendido

·        setPriority  para asignarle prioridad a un hilo sobre los demás

·        getPriority para cambiar la prioridad hacia un hilo determinado

·        sleep para suspender un hilo durante cierto tiempo

·        yield para ejecutar un hilo que está esperando

·        isAlive retorna True o false en dependencia de si el hilo está o no corriendo.

 

III.      Para crear un hilo el programador define una clase que extiende la clase Thread que es parte del java.lang package.

 

IV.      El método sleep( ) de la clase Thread puede ser utilizado para pausar un hilo por determinada cantidad de milisegundos. Cuando se usa este método debemos manejar la excepción que produce al interrumpir el programa antes de su terminación normal.

V.   En Java una subclase no puede ser heredera de dos o más clases simultáneamente. Como alternativa se utilizan las interfases, que son un conjunto de métodos. Esto es usual cuando se quiere construir un Applet que a su vez sea una subclase de la clase Thread.

VI.   Crear, estudiar y correr el Applet TimeApplet.

 

 

TimeApplet.

import java.applet.*;

import java.awt.*;

public class TimeApplet extends Applet implements Runnable

{

            private String msg1 = new String("Time is passing");

            private String msg2 = new String("plan your event today");

            private Font bigFont = new Font("Arial", Font.ITALIC, 24);

            private int secs;

            private Thread clock;

            public void init( )

            {

                        if (clock == null)

                        {

                                    clock = new Thread(this);

                                    clock.start();

                        }

            }

            public void run( )

            {

                        while(true)

                        {

                                    repaint();

                                    try

                                    {

                                                clock.sleep(1000);

                                    }

                                    catch(InterruptedException e) {}

                        }

            }

            public void stop( )

            {

                        clock.suspend();

            }

            public void start()

            {

                        clock.resume();

            }

            public void destroy()

            {

                        clock.stop();

            }

            public void paint(Graphics gr)

            {

                        ++secs;

                        gr.setFont(bigFont);

                        gr.setColor(Color.magenta);

                        gr.drawString(msg1,10,100);

                        gr.drawString("Time: "+secs,10,130);

                        gr.drawString(msg2,10,150);

            }

}

 

El applet usa el hilo del sistema por omisión, mientras que el reloj usa el hilo creado por Ud.

Sin aplicar la técnica de multihilos, el applet pareciera estar congelado, pues no puede simultáneamente atender el ciclo while (infinito) y aplicar el método repaint( ).

 

Ejercicios

 

1        Modificar el TimeApplet para que cada sesenta segundos cuente (y muestre) un minuto.

2        Crear un applet que muestre su nombre moviéndose de izquierda a derecha horizontalmente.

3        Agregue un botón de arranque al applet anterior.

4        Modifique el applet anterior para que el botón inicie el movimiento con el primer clic y lo detenga con el segundo.

5        Crear un applet que muestre un rectángulo descendiendo por un plano inclinado.

6        Crear un applet que muestre un circulo moviéndose diagonalmente. Al alcanzar un borde de la ventana del applet el circulo debe rebotar de manera tal de que el ángulo de incidencia sea igual al de reflexión.