Esta práctica nos ha parecido un poco extraña, ya que en un principio no sabíamos de que iban los Threads o hilos de ejecución ni tampoco estábamos muy seguros en que se diferenciaban los programas de los procesos…un lío. Menos mal que con la explicación del profe más o menos nos quedó claro.
Ejercicio 1:
Un programa necesita procesos para funcionar (por lo tanto siempre habrá mas procesos que programas). En sí son lo mismo, lo único que los procesos son el código que estamos ejecutando, por lo tanto es más incomprensible, por eso se crean los programas (que hacen que cualquier persona lo pueda entender).
Al principio nos dan el código de un programa llamado Ding. Es un programa sencillo que lo único que hace es esperar a que metas algo por teclado y cuando esto ocurra si es un enter te imprime DING! y si es cualquier otra letra no hace nada.
El apartado 2 es muy parecido al anterior pero en vez de imprimirtelo cada vez que das al enter, lo hace cada 1000 ms (1s), además esta vez se imprime DONG!. Para hacer que lo haga cada segundo se usa la sentencia :
Thread.sleep(1000); //siempre va en ms
En el tercer apartado te juntan los dos anteriores, es decir que imprima DING! cada vez que das al enter y DONG! cada segundo. Este programa funciona mal, puesto que el System.in.read() bloquea el equipo hasta que se introduce el enter por teclado, por lo tanto el DONG! no sale hasta que lo introduces (en vez de salir cada segundo que es como debería). Además nos hemos dado cuenta de que hace otra cosa que no nos concuerda, ya que cuando de las a enter debería salir DING! DONG!, sale DONG! DING! DONG!, como si cada vez que le dieras al enter hubiera antes otra cosa y al hacer el if no lo cumple…no entendemos muy bien porque ocurre.
Ejercicio 2:
Un hilo de ejecución( o thread ) es una característica que permite a una aplicación realizar varias tareas ( independientes) simultáneamente. Los distintos hilos de ejecución comparten recursos como el espacio de memoria, los archivos abiertos etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente. Cada vez que se lanza un thread se hace una nueva bifurcación en el programa para hacer lo que te van poniendo en el método run().
El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. Cuando el proceso es terminado, todos sus hilos de ejecución también lo son. Además si mato a la raíz ( desde la que he lanzado los thread), mato a todos los otros hilos aunque estos no hayan acabado aún de hacer todo su código.
El apartado 1 tiene varias cosas que nos extrañaron,por lo que investigamos un poco:
Runnable r = new Runnable() {
public void run() {
PrintThreadName();
}
};
- Se trata de una clase interna: que solo se puede usar en la clase en la que esta integrada. Todo esto se podría haber hecho en otra clase, pero como solo lo vamos a usar aqui, no hace falta.
- Runnable es una interfaz y r es un objeto que implementa a esa interfaz.
- Siempre que implementemos la interfaz Runnable tenemos que implementar su único método que es el run(). Dentro del run ponemos lo que queremos que haga el nuevo hilo que vamos a lanzar.
Thread t = new Thread(r);
t.start();
- Al crear un nuevo Thread le paso por parámetro el objeto de Runnable.
- El método start() lo único que hace es lanzar el hilo nuevo (hacer la bifurcación), va al método run() para ver que tiene que hacer, y lo ejecuta. Al método start no se le pasa nada por parámetro.
Los demás hacen lo mismo. Lo único que cambia es que una hereda de Thread y la otra implementa a Runnable. Esto es lo mismo, ya que si nos vamos al api nos encontramos con que la clase Thread ya implementa a Runnable por lo que al heredarla ya lo tenemos.
Ejercicio 3:
En este ejercicio se tratan las condiciones de carrera que se producen cuando dos hilos intentan acceder en el mismo momento al mismo recurso.
Miramos el código que nos daban ( clase RaceCondition) y nada mas verla piensas que van a salir los 10000 ceros y luego los 10000 unos ( pues así es el orden en el que está escrito), pero al compilarlo se ve que salen aleatoriamente ( según cual es el primero que llega)
No se nos ocurrieron muchas formas de solucionar este problema, si acaso alguna puede ser que cuando uno vaya a acceder a un recurso antes compruebe si hay otro accediendo a la vez…
El programa RaceConditionSolved esta evitando que dos hilos accedan a salida estándar ( esta solucionando la condición de carrera), para ello usa vectores, miramos un poco el código y lo ejecutamos.
Ya no hemos avanzado mas.Se nota que ya se acercan los exámenes, el día de entregar el juego… así que estamos demasiado liados con todo…
Un saludo


