laboratorio de programación concurrente en java


Hoy hemos tenido la segunda sesión del laboratorio de programación concurrente, después de la primera que tuvimos el martes y sirvió para plantearnos el programa que vamos a tratar: el simulador de trenes.

En esta ocasión se trataba de convertir el programa secuencial en un programa concurrente que utiliza Threads. En realidad el programa ya utiliza un único Thread que es el programa principal (en Java todo son Threads) Además debido a que el programa utiliza la interfaz gráfica, utiliza más Threads (el procesador de eventos de la librería gráfica). Pero su función principal de simulación de los trenes es secuencial. Para ello utiliza una estrategia de escrutinio periódico (polling) que consiste en que el Thread main (programa principal) invoca en cada objeto Tren, cada cierto tiempo, la operación actualiza() para que dicho objeto decida lo que tiene que hacer en su situación particular. En concreto, las funciones que realiza el programa principal son:

  • Instancia la clase RedFerroviaria y todos los objetos agregados a ella (i.e TramoFerroviario, CentroRegulacion y Tunel)
  • Instancia cada uno de los Trenes (i.e clase Tren) que van a circular por cada tramo ferroviario
  • Mientras no se cumpla el tiempo de ejecución (constante definida en el programa) invoca el método actualiza() de cada objeto Tren cada cierto tiempo (también fijado como constante en el programa)
  • Cuando queda poco para que acabe la simulación (el 80% de la ejecución, fijado como constante en el programa) se invoca el método termina() de cada objeto Tren, que provoca la finalización ordenada de cada uno hasta su centro de regulación

Esto se puede expresar de forma gráfica en un diagrama de actividad UML:

Diagrama de Actividad del Simulador de Trenes Secuencial

Para convertir esta versión secuencial en una versión concurrente se debe implementar la clase Tren como un Thread o una clase Runnable que pueda ser utilizada en un Thread. Además se deben utilizar los locks intrínsecos de la clase Object de la que derivan todas las clases Java incluidas las nuestras para las clases Tunel y CentroRegulacion, ya que van a ser utilizadas por todos los Threads Tren y por lo tanto tienen riesgos de seguridad en sus métodos y estado que deben de ser eliminados. Finalmente se deben utilizar los métodos wait y notify de la clase Object en esas mismas clases para sincronizar el acceso de todos los Threads.

Hoy solamente hemos convertido a Thread a la clase Tren y hemos dejado el resto de los detalles para una sesión posterior el lunes de la semana que viene. Para convertir a la clase Tren en un Thread hemos decidido hacerla una subclase de Thread y reimplementar (i.e override) el método run():

public class Tren extends Thread {

[...]

public Tren(TramoFerroviario.Tramos tramo,RedFerroviaria laRed,
                   int velocidad) {
	this.tramo=tramo;
	this.laRed=laRed;
	this.velocidad=velocidad;
	estado=EstadoTren.EN_CENTRO_REGULACION;
	posicion=0;
	this.start();
}

[...]

public void run() {
	while (!this.isInterrupted()) {
		try {
			actualiza();
			Thread.sleep(50);
		} catch (InterruptedException e1) { 
                    termina(); 
                }
	}
}

[...]

}

Sobre el código anterior hay que destacar que el constructor de la clase inicia también el thread de forma automática. Esto quiere decir que la creación de una clase Tren implica también la puesta en marcha de forma automática del mismo.

2 comentarios en “laboratorio de programación concurrente en java

  1. Se me ha ocurrido que este problema de simulación de trenes con programación concurrente puede ser un ejemplo de libro que puede haberse planteado en otras universidades en el mundo que traten el tema de la programación concurrente.

    Así que me he puesto a buscar por la red. He encontrado que este problema que nos han planteado en nuestra asignatura no es del todo original :)

    He encontrado un ejercicio con un planteamiento más sofisticado que el nuestro que es uno de los ejercicios de la asignatura de igual nombre (i.e concurrent programming) que se imparte en la Universidad de Chalmers en Suecia. Además parece que los nórdicos gustan de los problemas con trenes ya que en una universidad finlandesa, la Universidad Técnica de Helsinki (HUT) he encontrado otro problema muy similar con trenes al que nos han planteado a nosotros que se encuentra encuadrado en una asignatura afín de programación concurrente.

    En ambos casos comparten un simulador construido por la Universidad de Chalmers llamado tsim.

  2. Hay un detalle importante que se me ha olvidado comentar al explicar la transición de la clase Tren a una clase derivada de Thread. Cuando se implementa la función run() esta función pasa a ser la línea de flujo del Thread de cada objeto Tren y llama a la función actualiza() que hasta ahora era el método público utilizado por el Thread principal para implementar el comportamiento de los objetos Tren en la versión secuencial. Para proteger a los nuevos Threads debemos hacer que el método actualiza() sea privado. Con eso nos aseguramos que solamente puede ser llamado a través del método run()

    Además al implementar el método actualiza() en la solución secuencial ha habido una duda de cómo funciona las instrucciones de control switch/case (lo llaman en la jerga de lenguajes de programación syntactic sugar) en el lenguaje Java. Según he podido leer esas sentencias son una manera cómoda de enlazar sentencias if/then/else.

    En la red he encontrado dos referencias que clarifican a mi modo de ver esta cuestión. La primera es de la misma Sun, creadora del lenguaje Java, que en una web tutorial sobre el lenguaje tiene una sección específica a la estructura switch/case. La segunda referencia es procedente de un libro publicado por una consultora sobre el el lenguaje de programación Java.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s