Siguiendo con la serie que empecé con Framework RedDwarf a fondo (I): Comunicación, esta vez toca hablar de hilos. Como ya comenté en aquel post, este framework libre escrito en Java facilita el desarrollo de videojuegos multijugador en varias áreas distintas que no suelen ser contempladas por soluciones comerciales; siendo los hilos una de ellas.

A la hora de crear el servidor, siempre surge la siguiente pregunta: ¿cómo voy a gestionar las conexiones y eventos de los distintos clientes en paralelo? ¿un hilo de ejecución por cada cliente, un hilo por partida, o una thread pool?

Thread pool o "piscina de hilos"

Y la respuesta a estas preguntas es que con el framework RedDwarf, debes olvidarte de ello. RedDwarf te proporciona un motor el cual, efectivamente, es multitarea y multihilo. Pero este núcleo se esconde para proporcionar al programador un entorno que parece monohilo, como si éstos no existieran. Si quieres, puedes olvidarte de todo lo aprendido en el pasado acerca de los hilos, o mejor aún, puedes no aprenderlo para invertir tu tiempo en la verdadera lógica de tu juego.

Por detrás, RedDwarf funciona siguiendo el patrón de diseño Thread Pool, en el cual se crean un número fijo de hilos o “trabajadores” al que se le envían tareas como paquetes de trabajo. La piscina gestionará las tareas y repartirá el trabajo entre los hilos disponibles.  Esto es muy importante ya que esta piscina de hilos determinará automáticamente y en función de las capacidades de nuestra CPU el número de hilos a crear para la ejecución de tareas en paralelo. Vamos, que RedDwarf sacará todo el provecho de tu máquina sin que te tengas que preocupar de programar algo que, seguramente, te traería muchos dolores de cabeza. A esto hay que sumar que si un día decides ejecutar tu servidor en otro PC diferente, la piscina de hilos se adaptará a la nueva CPU al arrancar el servidor. Como muchos frameworks para otro tipo de cosas (Grand Central Dispatch, de Apple o Qt por ejemplo, de Nokia, también libre) han ido marcando, el futuro de la programación en paralelo son las tareas, no los hilos. Os dejo un video que lo explica muy bien, aplicado en Grand Central Dispatch. Aprovecho para recordar que en el Podcast 4 hablé de GCD en la sección de tecnología.

Vale, perfecto y maravilloso. ¿Pero cómo se utiliza esta piscina en un servidor que utilice RedDwarf? El gestor al que nos tendremos que dirigir será TaskManager (Gestor de tareas, no podía tener un mejor nombre), el cual nos permitirá programar tareas para su ejecución basándonos en un tiempo máximo de espera. Un ejemplo sería: “TaskManager, por favor, comienza a prepararme un café de aquí a un segundo” o también, por supuesto, “ahora mismo”. Otra utilidad que nos ofrece es la de programar tareas periódicas, que tengan que repetirse cada cierto tiempo (en un MMORPG, un buen ejemplo sería el amanecer y el anochecer, ejecutados cada 24 horas). Nosotros definiremos las tareas implementando la interface Task, la cual nos obligará a incorporar un método run() a nuestra clase. La piscina de hilos ejecutará este método el cual, al finalizar, indicará que se ha completado la tarea (fijaos en la imagen de arriba).

Resumiendo:

  • Acceso al TaskManager: AppContext().getTaskManager();
  • Servicios del TaskManager: schedulePeriodicTask() y scheduleTask()
  • Definición de taras: interface Task

¡Espero que os haya parecido interesante!

Links: RedDwarf, ProjectDarkstar