Orientaciones Didácticas Quincena 11
Orientaciones Didácticas Quincena 11
Orientaciones Didácticas Quincena 11
Curso 2008/2009
Parte teórica
Parte práctica
Base de conocimiento (alias preguntas más frecuentes)
Parte teórica
Ahora ya tenéis la base de la programación orientada a objetos. A partir de este nivel,
simplemente debéis especializaros en lo que más os guste y dedicar tiempo y esfuerzo. La
diferencia con respecto a otros lenguajes es que, con Java, ese tiempo/esfuerzo se reduce
drásticamente.
Y para muestra, en los dos temas que quedan del módulo, veréis un par de ejemplos de lo
sencillo que es abordar un problema, por específico que sea. Esto se debe a que,
habitualmente, ya hay otras personas (cinco, quinientas, dos mil, un millón) que tienen esos
mismos intereses y escriben código para solucionar ese problema o similares.
Para el estudio de esta unidad, debéis leer el apartado 5.9 del material que venimos utilizando
habitualmente y también el punto 6 de un nuevo documento que os he colgado en el aula. Se
trata del libro "Aprenda Java como si estuviera en primero" de Javier García de Jalón y otros
autores, profesores de la Escuela Superior de Ingenieros de Navarra.
Como ya sabéis, un ordenador tiene un único procesador por lo que únicamente pueden
ejecutar una intrucción en un instante de tiempo. A medida que han avanzado los programas
y, en concreto, los sistemas operativos, se ha visto la necesidad de poder ejecutar en paralelo
varios programas, pero esto es incompatible con lo que hemos dicho anteriormente (un
instante/una instrucción).
Los programadores comenzaron a estudiar técnicas para simular este efecto de multiejecución
en un instante de tiempo y se llego a lo que hoy conocemos como sistemas operativos
multitarea (la mayoría de los actuales). Obviamente es una emulación, por lo tanto consume
recursos de nuestro sistema.
Así, actualmente no nos sorprendemos si estamos con nuestro ordenador escribiendo en este
maravilloso foro guiño mientras escuchamos el último éxito de nuestro grupo favorito. En este
caso hay dos programas que parecen estar trabajando simultáneamente, el explorador web y
el reproductor mp3. Pero esto no es posible, ya que únicamente tenemos un procesador, por lo
que en realidad, se el sistema operativo está simulando esta multitarea.
Ahora ya tenemos multiprocesadores, pero siguen sin resolvernos el problema que abordamos
en este tema. Imaginad el caso que tenemos un procesador de cuatro y necesitamos ejecutar
cinco programas. Habrá un momento que siempre necesitaríamos más, por lo que la solución
software es lo que necesitamos.
¡Y es que siempre pedimos más! Ahora bien, no nos quejemos de qué cosas más complicadas
estamos estudiando. Esto nos lo pide el mercado (y vosotros mismos, apuesto a que sí).
Tanto la multitarea como el multihilo conllevan una serie de problemas, que vamos a ver muy
por encima en este tema, como por ejemplo el problema del acceso a un trozo de código por
parte de varios procesos (sección crítica). Pero esto lo veremos en una entrada del blog.
Parte práctica
La onceava Prueba de Evaluación Quincenal del módulo es una práctica dividida en dos partes.
Recordad que para acceder a la evaluación cuatrimestral, la entrega de todas las PEQs es
obligatoria (y cada una de ellas debe tener una nota superior a 2).
Base de conocimiento
De Amadeo Olmedilla García:
Estoy un poquito enganchado en el segundo punto de esta PEQ, ¿Alguien que haya podido encontrar
alguna buena documentación para realizarla?
123451234512345
123456789101112131415
¿Verdad?
el resultado debe ser el que supones y no el que obtienes. Seguramente no estás construyendo
correctamente la región crítica.
Ayer puse una entrada en el blog y ahora mismo estoy escribiendo otra. La que hay te sirve para la
primera parte de la práctica y la que estoy redactando (que espero tener publicada para el viernes
como muy tarde) es la que te va a venir bien para la segunda parte de la práctica.
Un saludo,
Cristian.
Efectivamente, eso tiene que ser así. Y añado, no puede ser de otra manera; me explico:
Tú, como programador, lo único que haces es iniciar -mediante start()- una serie de hilos: dos, tres,
cuatro, los que quieras. Después, es el planificador de hilos de Java el que controlará a qué hilo le da
tiempo de CPU en cada momento.
Y el problema viene ahí: como tú no sabes a priori qué hilo se ejecutará en cada momento, debes
controlar cualquier posible orden ejecución en los hilos. Lo bueno de esto es que Java ya nos da
herramientas (como synchronized) para solucionar los problemas de concurrencia, como por ejemplo
la sección crítica que es el que tratamos en nuestro segundo ejercicio.
Un saludo,
Cristian.
Saludos,
Santi.
La función sleep() la utilizo para "dormir" cada cierto tiempo el hilo, porque las CPUs actuales son muy
rápidas y posiblemente realizarían toda la ejecución en una sola pasada. Con sleep consigo que el
planificador haga su trabajo y vaya asignando tiempos de CPU cada vez a un hilo.
Elijo poner un número aleatorio, en lugar de uno fijo como parámetro, para que el tiempo de CPU no
sea siempre el mismo en cada ejecución. Así se visualiza mejor qué ocurre con la planificación de
hilos, ya que cada vez varía la duración de un hilo en ejecución y, sin embargo, el programa siempre
finaliza con el mismo resultado. Es decir, que hemos controlado correctamente la sección crítica, que
es de lo que se trata.
Si pones un número fijo, es muy fácil que siempre obtengas el mismo resultado en los tiempos de
planificación, y por tanto, no aprecies correctamente el funcionamiento de tu programa.
Es simplemente una cuestión de poder ver exáctamente cómo se comporta nuestro programa en
diferentes situaciones dadas por el planificador de hilos.
Un saludo,
Cristian.
En la primera parte, consigo que me imprima todo el abecedario, pero lo hace de manera desordenada,
¿como hago para que se ejecute primero un hilo y después el otro?
Lo he intentado con el join, pero me sigue apareciendo desordenado. No se si debo poner el primer hilo y
el segundo o únicamente uno en el join.
También he probado con el synchronized pero no se donde colocarlo (dentro de la función run?¿) ni
tampoco que debo ponerle(¿nombreDeVariableSeccionCritica se refiere al contador (i)?).
NOTA: Todos los comentarios tienen la autorización expresa de publicación de sus respectivos autores. Aquellos comentarios que aparecen firmados bajo la
autoría Anónimo, también se han publicado autorizados con la condición de no mostrar el nombre del autor.
Esta obra está bajo una licencia Reconocimiento-Compartir bajo la misma licencia 3.0 España de Creative Commons. Para ver una copia de
esta licencia, visite http://creativecommons.org/licenses/by-sa/3.0/es/ o envie una carta a Creative Commons, 171 Second Street, Suite
300, San Francisco, California 94105, USA.