Informe de Laboratorio - Threads
Enviado por kadrrc • 1 de Octubre de 2022 • Informe • 1.588 Palabras (7 Páginas) • 58 Visitas
[pic 1] | UNIVERSIDAD NACIONAL DE SAN AGUSTIN FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMA | [pic 2] |
Formato: Guía de Práctica de Laboratorio / Talleres / Centros de Simulación | ||
Aprobación: 2022/03/01 | Código: GUIA-PRLE-001 | Página: |
INFORME DE LABORATORIO
INFORMACIÓN BÁSICA | |||||
ASIGNATURA: | Sistemas Distribuidos | ||||
TÍTULO DE LA PRÁCTICA: | Los hilos (Threads) | ||||
NÚMERO DE PRÁCTICA: | 1 | AÑO LECTIVO: | 2022 | NRO. SEMESTRE: | 2022A |
FECHA DE PRESENTACIÓN | 03/05/2022 | HORA DE PRESENTACIÓN | |||
INTEGRANTE (s): GRUPO “5” | NOTA: | ||||
DOCENTE(s): Molina Barriga, Maribel |
SOLUCIÓN Y RESULTADOS | ||||
Este ejemplo muestra la demostración de cómo funciona la programación concurrente, con carreras de hilos y procesos. Se realizan 4 carreras con 4 hilos(corredores). Codigo en Java: [pic 3] [pic 4] [pic 5] Resultado de la ejecución: [pic 6] [pic 7]
En este ejemplo hay un productor, el cual genera un entero entre 0 y 9, lo almacena en un objeto de tipo CubbyHole, e imprime el número generado. Para hacer más interesante el problema de la sincronización, el productor duerme durante un tiempo aleatorio entre 0 y 100 milisegundos antes de repetir el ciclo de generación de números. Clase Consumidor [pic 8] Clase Productor [pic 9] Clase CubbyHole [pic 10] Clase Principal [pic 11] Por último, tenemos los resultados de la ejecución del programa: [pic 12]
En este ejemplo se utilizan nuevas técnicas de sincronización con la creación de la clase “CubbyHole”. Esta clase se puede ver a continuación: [pic 13] Finalmente, se muestra la ejecución del programa con esta clase: [pic 14]
En este ejemplo se implementa la clase Animación.java que consta de los siguientes metodos:
Ejecución del Applet [pic 15]
Para el ejemplo 1, las carreras de los 4 corredores, en la cual la distancia que cada uno avanza se da de manera aleatoria y estos resultados se van guardando. Se realizan 4 carreras, una a continuación de la otra, para ello cada hilo le pasa su contador al siguiente. Al finalizar cada corredor, se mandan mensajes por consola, estos valores son almacenados. Para el ejemplo 2, tanto consumidor como productor trabajan con objetos, como el CubbyHole que son compartidos entre dos threads y cuyo acceso debe ser sincronizado son llamados condiciones variables. El lenguaje Java permite sincronizar threads alrededor de una condición variable mediante el uso de monitores. Los monitores previenen que dos threads acceden simultáneamente a la misma variable.los métodos notify() y wait() del objeto para coordinar la actividad de los dos threads y también para asegurarse de que cada valor situado en él por el Productor es recuperado una vez y al igual que por el Consumidor. Para el ejemplo 3, como CubbyHole tiene dos métodos sincronizados, java proporciona un único monitor para cada ejemplar de CubbyHole. Siempre que el control entra en un método sincronizado, el thread que ha llamado el método adquiere el monitor del objeto cuyo método ha sido llamado. Entonces, otros threads no pueden llamar a un método sincronizado del mismo objeto hasta que el monitor sea liberado. Para el ejemplo 4, el método run() de la aplicación se encarga de la creación cada hilo, el cual se representa sobre una Applet que se ejecuta con ayuda del appletviewer que está disponible hasta el jdk 8. [pic 16]
Para el ejemplo 1, se tomó en consideración utilizar un código fuente que haga una simulación con la carrera de hilos para luego probar y evaluar el control de hilos por medio de algunos métodos, ya que el código proporcionado no podía ser probado porque no contiene la documentación de la clase Contar. Para ello el programa utiliza pequeñas ventanas con los valores de cada carrera y también la cantidad de sprints de cada corredor. Se notifica por consola cuando cada corredor llega a la meta (50m), al final de la ejecución se muestra en consola el reporte de las carreras. Para el ejemplo 2, en este ejemplo tanto la clase Consumidor y Productor requerían utilizar la clase CubbyHole del ejemplo 3, para dicha interacción o sincronización se utilizó los métodos put() y get(). Por último se creó una clase para probar dichas clases y observar sus resultados, de esta manera los hilos concurrentes comparten datos y consideran el estado y actividad de otros hilos. Para el ejemplo 3, la clase CubbyHole tiene dos variables privadas: contents, qué es el contenido actual de CubbyHole, y la variable booleana available, que indica si se puede recuperar el contenido de CubbyHole. Cuando available es verdadera indica que el Productor ha puesto un nuevo valor en CubbyHole y que el Consumidor todavía no la ha consumido. El Consumidor sólo puede consumir el valor de CubbyHole cuando available es verdadera. Para el ejemplo 4, lo primero que se realizó fue descargar el JDK 8 para la ejecución de los applets porque estos ya no tienen soporte desde esa versión de java, el código proporcionado se pasó al IDE java en donde la ejecución se realiza como Applet, con la ejecución del programa se genera el archivo.class correspondiente, este archivo Animacion.class es llamado desde el archivo index.html y finalmente se ejecuta este archivo con appletviewer. [pic 17] | ||||
Es el término utilizado para ejecutar múltiples hilos dentro de un solo proceso con el fin de ejecutar múltiples tareas al mismo tiempo. El multihilo se puede hacer usando hilos de CPU a través del sistema operativo o usando la capacidad del lenguaje de programación para ejecutar múltiples hilos. Actualmente, la mayoría de las aplicaciones utilizan el multihilo para proporcionar una mejor experiencia al usuario.
Los hilos están compuestos por estados como se puede ver a continuación: [pic 18] El comportamiento de un hilo depende del estado en que se encuentre, este estado define su modo de operación actual. Los estados en los que puede estar un hilo Java son:
Los hilos en un sistema permiten a una aplicación realizar varias tareas a la vez concurrentemente, los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autentificación. Esta acción permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente. Los hilos poseen un estado de ejecución y pueden sincronizarse entre ellos para evitar problemas de compartimiento de recursos. Generalmente, cada hilo tiene una tarea específica y determinada, como forma de aumentar la eficiencia del uso del procesador.
Los hilos los podemos utilizar cuando en nuestra aplicación tenemos:
Este tipo de operaciones podemos encontrar en:
| ||||
El lenguaje Java y el sistema de ejecución soportan la sincronización de threads mediante el uso de monitores. En general, un monitor está asociado con un objeto específico (una condición variable) y funciona como un bloqueo para ese dato. Cuando un thread mantiene el monitor para algún dato del objeto, los otros threads están bloqueados y no pueden ni inspeccionar ni modificar el dato. Asimismo, los segmentos de código dentro del programa que acceden al mismo dato dentro de threads concurrentes separados son conocidos como secciones críticas. En el lenguaje Java, se pueden marcar las secciones críticas del programa con la palabra clave synchronized. La utilidad de la programación multihilos resulta evidente. Por ejemplo, un navegador Web puede descargar un archivo de un sitio, y acceder a otro sitio al mismo tiempo. Si el navegador puede realizar simultáneamente dos tareas, no tendrá que esperar hasta que el archivo haya terminado de descargarse para poder navegar a otro sitio. En conclusión la programación multihilo está presente en la mayor parte de las aplicaciones informáticas que usamos cotidianamente sin importar el lenguaje en que se desenvuelvan, el concepto de Thread o Hilo seguirá siendo el mismo. |
...