Está en la página 1de 31

UNIVERSIDAD TECNOLOGICA DE LA MIXTECA

MAESTRA EN ROBTICA

PRACTICAS PRIMER
PARCIAL
Threads

Prcticas que presenta el


C. Jonathan B. Bautista Ocampo
Para el primer parcial
Programacin concurente y en tiempo real

Maestro:
Dr. Jos Anibal Arias Aguilar

Loma Bonita Oaxaca.

Noviembre del 2016.

ndice general
1. Introduccin
1.1. Marco torico . . . . . . . . .
1.2. Antecedentes . . . . . . . . .
1.3. Objetivos . . . . . . . . . . .
1.3.1. Objetivo general . . .
1.3.2. Objetivos particulares

.
.
.
.
.

1
1
2
3
3
3

.
.
.
.

5
5
8
9
10

3. Practica 2 Concurrencia
3.1. Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13
13
14

4. Prctica 3 Comunicacin y sincronizacin


4.1. Caso I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17
17

5. Practica 5: Comunicacin y sincronizacin parte II.


5.1. Actividad 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Actividad 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19
19
19

6. Conclusiones y perspectivas
6.1. Conclusiones generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2. Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21
21
21

Bibliografa

21

2. Prctica 1: Threads
2.1. Programa 1. . . .
2.2. Programa 2 . . .
2.3. Programa 3 . . .
2.4. Programa 4 . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

ii

NDICE GENERAL

ndice de guras
2.1. Funcin main: Llamada del constructor de threads extendidos anidado en un
cilo for. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Cuerpo de thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Esquema de los thredas dentro de Java. . . . . . . . . . . . . . . . . . . . . .
2.4. Resultados de la simulacin del programa. . . . . . . . . . . . . . . . . . . .
2.5. metodo main: creacin y ejecucin de threads . . . . . . . . . . . . . . . . .
2.6. cuerpo de la interfaz ruunable:mtodo run() y el mtodo to String. . . . . .
2.7. Main: se crea y ejecuta el hilo de ejecucion. As como el bloque de interrupciones.
2.8. Cdigo para vericar nmero primo y la interrupcin. . . . . . . . . . . . . .
2.9. Clase que verica si el nmero es primo. . . . . . . . . . . . . . . . . . . . .
2.10. Resultado de simulacin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.11. Se crea y se manda a ejecutar los threads sleepy y dopey. . . . . . . . . . . .
2.12. Clase sleeper del thread sleepy . . . . . . . . . . . . . . . . . . . . . . . . . .
2.13. clase joiner dl thread Dopey. . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.14. Rsultado de simulacin de los dos threads. . . . . . . . . . . . . . . . . . . .

5
6
7
7
8
8
9
9
10
10
11
11
11
12

3.1. Rsultado de simulacin de los threads del restaurant. . . . . . . . . . . . . .


3.2. main: Thread hi y bye ; ejecutandose concurrentemente. . . . . . . . . . . .
3.3. Rsultado de simulacin de concurrencia de dos thredas. . . . . . . . . . . . .

14
15
15

5.1. mtodo transfer de las cuentas bancarias. . . . . . . . . . . . . . . . . . . . .


5.2. Resultado de simulacin de las cuentas bancarias. . . . . . . . . . . . . . . .

20
20

iii

iv

NDICE DE FIGURAS

ndice de cuadros

vi

NDICE DE CUADROS

Captulo 1
Introduccin
1.1.

Marco torico

La maquina virtual de Java (JVM) es un sistema multihilo. Es decir, es capaz de ejecutar


varios hilos de ejecucin simultanemanete vase [2].
Java da soporte al concepto de thread desde el propio lenguaje, con algunas clases e interfeces
denidas en el paquete java.lang y con mtodos especicos para la manipulacin de threads
en la clase object.
Desde el punto de vista de las palicaciones los hilos son tiles por que permiten que el
ujo del programa sea dividido en dos o ms partes, cada uno ocupandose de alguna tareade
forma independiente vase en [3]. Por ejemplo un hilo puede encargarse de la comunicacin
con el usuario, mientras que otros actan en segundo plano, realizando la transmision de un
chero, accediendo a recursos del sistema (cargar sonidos, leer cheros, etc). De hecho, todos
los programas con interface grco (AWTo Swing) son multihilos por que los eventos y as
rutinas de dibujado de las ventanas corren en un hilo distinto al principal.

Creacin de Thread
Hay dos mtodos de conseguir hilos de ejecucin (threads) en Java. Una es implementando
el interfaz Runnable. la otra es extender la clase thread vese en [4].
La implementacin del interfaz Runnable es la forma habitual de crear hilos. Los insterfaces proporcionan al programador una forma de agrupar el trabajo de infraestructura de
una clase. Se utilizan para disear los requerimientos comunes al conjunto de clases a implementar. EL interfaz dne el trabajo y la clases o clases, que implementa el interfaz para
realizar ese trabajo.
Hay unas cuantas diferencias entre interfaz y clase. Una interfaz solo puede contener
mtodos abstractos y/o variables estticas y nales constantes. Las clases por otro lado,
pueden implementar mtodos y contener variables que no sean constantes. Segundo un interfaz no puede implementar cualquier mtodo. Una clase que implemente una interfaz debe
implementar todos los mtodos denidos en esa interfaz.

CAPTULO 1. INTRODUCCIN

1.2.

Antecedentes

Usos ms comunes son en tecnologias SMPP Y SMS para las telecomunicaciones aqu
hay muchisimos procesos corriendo a la vez y todos requeriendo de un servicio.
Trabajo interactivo y en segundo plano, ejemplo hojas de calculo, un hilo puede estar
visaulizando y leer la entrada del ususario mientras que otro hilo ejecuta las oridenes y
actualiza la hoja de clculo.

Procesamiento asincrono
Los elementos asincronos de un programa se puden implementar como hilos. Un ejemplo
es como los softwares de procesamiento de texto guardan archivos temporales cuando se
estan ejecutando en dicho programa. Se crea un hilo que tiene como funcin guardar una
copia de respaldo mientras se contina con la operacin de escritura por el usuario, sin inferir
en la misma. Son como dos programas independientes.

Aceleracin de ejecucin
Se pueden ejecuar por ejemplo, un lote mientras otro hilo lee el lote siguiente de un
dispositio.

Implementaciones
Hay dos grandes categorias:
Hilos a nivel usuario: En una aplicacin a nivel usuario, todo el trabajo de gestin de
hilos lo realiza la aplicacin y el ncleo o kernel no es consciente de la existencia de
hilos.
Hilos a nivel ncleo: Tod el trabako de gestion de hilos lo realiza el kernel. En el area
de la aplicacin no hay cdigo de gestin de hilos, nicamente un API (interfaz de
programa de aplicacin) para la gestin de hilos en el ncleo, windows 2000, Linux y
OS/2 utiliza este mtodo. Linux utiliza un mtodo muy particular en el que no hace
diferencia entre procesos e hilos. Para linux, si varios procesos creados con la llamada al
sistema loneomporten el mismo espacio de direcciones virtuales, el sistema operativo
los trata como hilos y lgicamente son manejados por el kernel.

consultado en [1].
En aos recientes, Sira-Ramrez et al., en [?], [?], [?] han estudiado y desarrollado un
algoritmo de rechazo activo de perturbacin basado en un Observador Proporcional Integral
Generalizado, inspirado en el contexto de procesamiento de seales, por considerar a la
perturbacin como una seal acotada por una familia de polinomios de Taylor variantes en
el tiempo, haciendo una extensin del Observador de Luenberger. As tambin, en [?], [?], [?]
se pueden ver las aplicaciones de ste esquema de control en robots paralelos, suspensiones
activas de automvil y ejes de mquinas herramientas. Dicha metodologa se implementar
en el control de movimiento del servosistema mecatrnico.

1.3. OBJETIVOS

1.3.
1.3.1.

Objetivos
Objetivo general

Crear objetos dereivados de la clase Thread.

1.3.2.

Objetivos particulares

Compilar, ejecutar y explicar como se lleva a cabo la calendarizacion de los threads en


los programas presentados en la prctica 1.
Vericar y prcticar la concuerrencia en Java de la prctica 2.
Revisar la comunicacin y sincronizacin de Java en la prrctica 3.
Prcticar la denicin y ejecucin de grupos de Threads de la prctica 4.
Revisar la comunicacin y sincronizacin parte 2 de la prctica 5.

CAPTULO 1. INTRODUCCIN

Captulo 2
Prctica 1: Threads
Crear objetos derivados de la clase Thread.
Acitividad: Compile, ejecute y explique (utilice grcas) cmo se lleva a cabo la calendarizacin de los threads en los siguientes programas.

2.1.

Programa 1.

La calendarizacin se trata sobre el tiempo que el procesador cede a cada thread para su
ejecucion lo que nos daria la sensacion de ejecutarse paralelamente cada Thread.
A continuacin mostramos el cdigo numero 1.
Lo primero que debemos observar que los thredas son llamados a contruirse desde el
main vase fgura 2.1 por el ciclo for mediante la instruccin new P1SimpleThread(). start();
este manda a extender la clase que por default tiene java lo que nos permite generar varios
Threads en este caso solo 5.

Figura 2.1: Funcin main: Llamada del constructor de threads extendidos anidado en un cilo
for.

CAPTULO 2. PRCTICA 1: THREADS

Cuando es incializado cada Thread, es puesto en marcha como se ve en el cdigo de la


fgura 2.2. Se observa que al entrar al cuerpo del Tread P1SimpleThread se inicializan las
variables privadas countDown(contador decendente), asi como threadcount (contador de los
threads creados).

Figura 2.2: Cuerpo de thread.

Se observa que se manda imprimir la palabra construyendo para cada thread invocado por el ciclo for. Despus se sigue con el metodo run() el cual tiene un ciclio anidado
con un if donde se pregunta al contador dencendente si se mando a ejecutar cinco veces cada
thread.
Al nalizar el for de main y haberse ejecutado los thredas se manda un ltimo mensaje
donde se visualiza que todo los thredas han sido comensados.
Acontinuacion se muestran los resultados de la ejecucin del programa. En la gura 2.3
se muestra un esquema de ejecucin de los threads dentro del proceso de la maquina virtual
de java.
A continuacin veremos el resultado nal en la siguiente fgura2.4 como se puede ver se
ejecutan los threds por cada interaccin del ciclo for localizado en main. tambin observamos
que dentro del mtodo run hay un ciclo podria decirse innito que solo rompe o se sala de l
mediante un return cuando el countDown es igual a cero, con esto vemos que un solo thread
es llamado o ejcutado cinco veces.Por ltimo podemos ver que por cada ejecucin que se
haga lla calendarizacin o asignacin en tiempo de ejecucuion en el porcesador no va ser el
mismo tiempo para todos ni mucho menos en un orden concreto.

2.1. PROGRAMA 1.

Figura 2.3: Esquema de los thredas dentro de Java.

Figura 2.4: Resultados de la simulacin del programa.

2.2.

CAPTULO 2. PRCTICA 1: THREADS

Programa 2

La interfaz runnable declara una funcin miembro denominada run() que dene la clase
que implmentan a la interfaz. Una interfaz es una clase abstracta pura en la que todos sus
mtodos son abstractos y por tanto no se puden inplementar en la clase interface.
Las interfaces sirven para establecer la forma que debe tener una clase.En el siguiente
programa veremos la creacin de thread y su calendarizacion implementando la interfaz
runnnable.
En el mtodo main tenemos un ciclo for el cual crea y ejecuta los threads el cual crea y
ejecuta los threads , invocando la ejecuacin del hilo con el mtodo run. Vase la fgura2.5.

Figura 2.5: metodo main: creacin y ejecucin de threads

Despus en el mtodo run() tenemos el ciclo innito while el cul mandara imprimir lo
que contiene el mtodo String to String(), la forma de que se mueva este thread es que el
contador countDown decrezca la cinco veces.Vase fgura2.6.

Figura 2.6: cuerpo de la interfaz ruunable:mtodo run() y el mtodo to String.

2.3. PROGRAMA 3

2.3.

Programa 3

En este cdigo se vera el mtodo sleep de la clase thread de java asi como el interrutedException.
En el main se crea y se ejecuta el thread task el cual en su hilo de ejecucion manda
imprimir un nmero impar. Despus de 5 segundos se le manda una interrupcion para que el
thread termine su ejecucin.Con el mtodo thread.sleep generamos ciclos de espera. El thread
se duerme y no se usa ciclos de reloj o procesador con sleep. Esto genera una interrupcin
llamada interuptionException. Vase la fgura2.7.

Figura 2.7: Main: se crea y ejecuta el hilo de ejecucion. As como el bloque de interrupciones.

El hilo de ejecucin de la clase PrimeGnerator ejecutamos el mtodo run() que es el que


aplica la concurrencia. En su ciclo inito llamamos a isPrime el cual es un mtodo que nos
dice si es primo, si es verdad esa condicion imprime que e snumero primo tambien tenemos
otra concicin para checar si se ha sucitado alguna interrupcion.Vase fgura2.8.

Figura 2.8: Cdigo para vericar nmero primo y la interrupcin.

La clase "is prime"solo nos verica y dice que si es un numero primo, si es verdadero solo
retorna a "primeGnerator"la condicin de verdadero y retorna false cuando no lo es. Vase
la fgura2.9.

10

CAPTULO 2. PRCTICA 1: THREADS

Figura 2.9: Clase que verica si el nmero es primo.

Acontinuacin se muestra el resultado de la simualcion en la fgura2.10, como se puede


ver se imprime los numeros primos hasta que ocurre la interrupcin ocasionado por el mtodo
sleep.

Figura 2.10: Resultado de simulacin.

2.4.

Programa 4

Este programa se tiene dos thread donde se busca la sincronizacin de los mismos;
con el mtodo join y sleep
En el main de este programa se hechan andar dos threads sleepy y dopey como se muestra
en la fgura.
A continuacin se muestra los threads sleepy y dopey vase la fgura 2.12 y fgura2.13,
en su mtodo run se da el tiempo donde inicia primero sleepy y despues de de 1.5 se
duerme. Luego arranca Dopey se ejecuta join lo cual hace que se bloque; hasta que sleepy
se despierta, entonces Dopey se termina de completar.Este lo puede ver en los resultado de
simulacin que se muestran en la fgura2.14.

2.4. PROGRAMA 4

11

Figura 2.11: Se crea y se manda a ejecutar los threads sleepy y dopey.

Figura 2.12: Clase sleeper del thread sleepy

Figura 2.13: clase joiner dl thread Dopey.

12

CAPTULO 2. PRCTICA 1: THREADS

Figura 2.14: Rsultado de simulacin de los dos threads.

Captulo 3
Practica 2 Concurrencia
Se prcticara el modelo de concurrencia de java. El cual consiste en de manera sincronizada hacer las tareas para cada hilo de ejecucin y as no interferiri en el funcionamiento de
otro al querer accesar a un recurso.

3.1.

Actividad 1

Compile, ejecute, analice y explique el siguiente cdigo.


Se implementa una clase Restaurant donde tenemos al chef y WaiPerson(mesero) que son
nuestros Threads. En la clase Restaurant tenemos un main que crea y ejecuta los threads
antes mencionados.
En este modelo de concurrencia se ejecutan estos dos threads el cual utilizan orden de
la clase Restaurant. Y ambos estan sincronizados los cuales utilizan orden para noticarse
para esperar una orden en el caso del mesero y el meseroa su vez pone la variable order en
null para que el chef sepa que ya no hay un platillo.
En Waitperson su mtodo run tiene un ciclo innito el cual tiene una condicion donde
pregunta si hay una orden si no la hay entra a un bloque siynchronized que contiene un
bloque de interrutionException; donde en Try tenemos un wait() que hace que el thread
mesero se duerma hasta que sea noticado por chef de que ya hay una orden este vuelve
a despertar y a ejecutarse. El caso contrario en la condicion donde se pregunta si hay un
platillo en caso de haber se brinca esta condicin y manda a imprimir el mensaje de que
mesero obtuvo cierto numero de platillos la concatenacin manda a llamar al mtodo order
de la clase order que se denio en la clase restaurant que lleva el nmero de platillos.
El thread chef al igual que Wairperson se esta ejecutando de manera concurrente ya que
su mtodo run esta dentro de un ciclo innito si no hay comida disponible este manda hacer
ms con el mtodo order y notica a waitperson de que ya hay un platillo disponible esto lo
hace con el bloque sychronized(Waitpearson) ejecutando el notify que hace que waitperson
salga del wait. En caso de que en la condicin le diga que si hay comida, en el bloque de try
del bloque de excepciones se duerme con el sleep unos segundos , para despus preguntar de
nuevo si hay o no comida.
Ya para nalizar cuando las comidas llego a su limite que son diez el mtodo order dentro
13

14

CAPTULO 3. PRACTICA 2 CONCURRENCIA

de la clase order da un mensaje avisando de que se acabo la comida por que se llego a los
diez platillos.

Figura 3.1: Rsultado de simulacin de los threads del restaurant.

3.2.

Actividad 2

Los objetos imprime un mensaje peridicamente y de manera indenida. Utilice el modelo


de concurrencia de java para que estas dos tareas se ejecuten de manera cooordinada.
Para esta actividad son dos threads que se ejcutan de manera concurrente se crean y
ejecutan desde main, despus de su creacin se les pone un sleep(1000) al thread hi para que
se duerma y le de chance a el thread bye mediante join para que se ejecute.
como quien dice que se espera para que se ejecute cuando menos una vez.Luego el thread
bye hace lo mismo y asi se van turnando para la ejecucion de sus respectivos mensajes en
sus mtodos run. Vease la gura3.2 y 3.3.

3.2. ACTIVIDAD 2

Figura 3.2: main: Thread hi y bye ; ejecutandose concurrentemente.

Figura 3.3: Rsultado de simulacin de concurrencia de dos thredas.

15

16

CAPTULO 3. PRACTICA 2 CONCURRENCIA

Captulo 4
Prctica 3 Comunicacin y
sincronizacin
En este captulo se presenta el diseo de un controlador proporcional-derivativo (PD)
basado en un observador de perturbacin,

4.1.

Caso I

17

18

CAPTULO 4. PRCTICA 3 COMUNICACIN Y SINCRONIZACIN

Captulo 5
Practica 5: Comunicacin y
sincronizacin parte II.
Revisar el modelo de sincronizacin de Java

5.1.

Actividad 1

Modicar el codigo de cuentas bancarias para que no se corrompa.


A este cdigo se le sincronizo el mtodo transfer para que cada thread o cuenta accediera
uno la vez.

5.2.

Actividad 2

Modique elcdigo de tal manera que si una cuenta no tiene el dinero suciente para
hacer el retiro correspondiente, en lugar de abortar la transaccin, sta se suspenda hasta
que a la cuenta le sea abonada una cantidad que permita proceder al retiro.
En este cdigo como se muestra en la gura, se le quito el return y se le puso un wait
para que esperara que otro thread le transriera y asi si se le pude quitar dinero. Mientras
tendra que esperar a que le notiquen que rebice si tiene dinero esa cuanta momentanemente
bloqueada. En la fgura se muestra los resultados de simulacin de las cuentas bancarias como
se puede ver el dinero con que se inicio la inversion no decrece ni aumenta solo se mueve
entre cuentas.

19

20

CAPTULO 5. PRACTICA 5: COMUNICACIN Y SINCRONIZACIN PARTE II.

Figura 5.1: mtodo transfer de las cuentas bancarias.

Figura 5.2: Resultado de simulacin de las cuentas bancarias.

Captulo 6
Conclusiones y perspectivas
6.1.

Conclusiones generales

Lan l

6.2.

Trabajo futuro

21

22

CAPTULO 6. CONCLUSIONES Y PERSPECTIVAS

Bibliografa
[1] https://es.wikipedia.org/wiki/Hilo_de_ejecuci %C3 %B3n consultado 25 de noviembre
de 2016.

[2] Introduccin a la programacion Java. https://www.ibm.com/developerworks/ssa/java/tutorials/jintrotojava1/ sonsultado 25 de noviembre de 2016.

[3] La calse derivada thread http://www.sc.ehu.es/sbweb/sica/cursoJava/applets/threads/subprocesos.ht


consultado 25 de noviembre de 2016.

[4] creacin y control de hilos http://dhw.umh.es/alex-bia/teaching/PC/material/hilos_tutorial-java/cap10-2.htm consultado 25 de noveimbre de 2016.

23