24 marzo 2015

Hilos en Java: Threads

En mi post anterior dibujamos una pista de carreras rudimentaria con rectángulos usando Java.  Pero, ¿de qué sirve una pista sin carros?  Eso mismo pensé, así que en esta ocasión vamos a añadirle código al proyecto anterior para que podamos tener dos carritos moviéndose de forma independiente una de otra.

La mejor manera de hacer que cada carro se mueva de forma independiente a la ejecución del resto del programa es usar algo llamaos hilos o threads como se conocen en inglés.  Cada thread es un código (o "flujo de control" para que se oiga más interesante) que se ejecuta en paralelo con el resto del programa (o con otros threads).  Es la forma de implementar multiprocesamiento en un programa de Java (¿nunca han escuchado de multithreading cuando hablan de sistemas operativos?).

Para crear un thread, lo vamos a implemtar como una clase que está dentro de la clase principal (en el caso de este ejemplo, va a ser una clase dentro de mi clase RaceGame).  Lo único que hay que cuidar es que herede de la clase Thread.  El código de declaración de la clase interna sería esta:

public class extends Thread {
}

Como has de imaginar, puede ser cualquier cosa menos el nombre de la clase en la que está declarado (recuérdate que lo estoy implementando como una clase dentro de la otra clase).  En mi caso, declaré dos clases de este tipo (una para cada carrito) llamados moveCar1 y moveCar2.

El corazón de un thread es el método run().  Aquí es donde se define el código que se va a ejecutar.  En mi caso concreto voy a mover un carro y lo voy a poner dentro de un ciclo infinito para que siempre esté moviéndose.  Un ciclo while(true) me sirve para este fin.

Para hacer mi programa mas seguro, voy a poner mi código dentro de un bloque try...catch.  El código que ponga después de la instrucción try se va a ejecutar, pero si hay algún problema va a hacer lo que le diga en la sección catch.  De otra forma, mostraría error y truena mi programa.  Lo que he dicho hasta ahorita se vería así:

while (true) {
    try {
        // código para mover el carrito
    } catch (Exception e) {
        break;
    }
}

Como podrá observar el lector, si sucede un error simplemente lo ignoro (con el break).  A lo mejor en otro tipo de programa podría poner código aquí para cerrar bases de datos, liberar memoria, o intentar otra cosa.  Pero en este programa simplemente voy a hacer de cuenta que nada pasó.  Y como el lector podrá deducir, en lugar de lo que va en el comentario // código para mover el carrito debe ir el código que haga que se mueva el carro.

Finalmente para que el Thread se ejecute, es necesario crear el objeto y llamar su método start().  Así que en el constructor de la clase principal, en mi caso RaceGame, voy a escribir lo siguiente:

moveCar1 mc1 = new moveCar1();
mc1.start();

En este video muestro lo que expliqué aquí (con los cambios que realicé en el código del proyecto anterior) y el código modificado lo puedes descargar aquí.


La imagen de Duke (la mascota de Java) con hilos (o Threads) lo tomé de una página de crunchify.com.  Y, al igual que con el post anterior, la idea de este proyecto surgió de este libro:



¡Hasta la próxima!
Publicar un comentario
Related Posts Plugin for WordPress, Blogger...