Mejoran la carga páginas/experiencia de usuario
Son aplicables a desarrollo de aplicaciones móviles
Estamos viendo conceptos avanzados de Java
1. Sincronización y prioridad
eugeniaperez.es
1. Sincronización y prioridad
Cuando se ejecuta un hilo, la ejecución continúa
hasta que:
Si coinciden 2 o más threads con la misma prioridad
y listos -> Round Robin
eugeniaperez.es
1. Sincronización y prioridad
eugeniaperez.es
Los SOs Windows admiten la estrategia de planificación por división de tiempos a fin de evitar que un hilo se apodere del control de la CPU por un periodo de tiempo prologado -> selfish thread.
public int tick = 1;
public void run() {
while (tick < 10000000) {
tick++;
}
}
El hilo no abandona voluntariamente la CPU.
Se ejecuta hasta que se termine el while o venga otro con mayor prioridad...
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores
La sincronización de threads implica disponer de mecanismos que permitan cerciorarse de que no se producen situaciones de inanición (bloqueo de hilos), punto muerto o interbloqueo.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores
La sincronización tiene como objetivo que se opere satisfactoriamente con los recursos compartidos por los hilos concurrentes.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores
A continuación vamos a ejemplificar la compartición de recursos a través de un objeto contenedor común, mediante el algoritmo del Productor-Consumidor.
1.1 Sincronización de threads: monitores
Text
eugeniaperez.es
Monitores:
algoritmo del
Productor-Consumidor.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
Cuando 2 threads necesitan compartir información
Ejemplo:
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
Necesitamos mecanismos de control, en caso contrario podría suceder que el Consumidor no obtuviese cada valor producido por el Productor una y sólo una vez.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
¿Y si el Productor fuese más rápido que el Consumidor y generase dos números antes que el Consumidor tuviera una posibilidad de consumir el primero?
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
¿Y si el Consumidor fuese más rápido que el Productor y consumiera el mismo valor dos veces o más?
1.1 Sincronización de threads: monitores
Text
eugeniaperez.es
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
Para prevenir estas condiciones en el ejemplo del Productor /Consumidor, el almacenamiento de un entero en el Contenedor por el Productor debe estar sincronizado con la recuperación por parte del Consumidor.
Se gestiona mediante Monitores:
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
El productor tiene una variable llamada container que permite almacenar los datos que va produciendo.
El método run se encarga de producir aleatoriamente el dato y mediante el método put se coloca en el contenedor.
Productor
Consumidor
Contenedor
run()
run()
put(data)
get(): data
Thread
Thread
1.1 Sincronización de threads: monitores
eugeniaperez.es
Productor-Consumidor
A los objetos a los que acceden varios hilos se les llama condiciones variables: Contenedor.
Los Monitores permiten controlar el acceso a las condiciones de variables, garantizando la sincronización de threads.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Productor-Consumidor
Se consideran secciones críticas aquellos fragmentos de código marcados en Java con la palabra reservada synchronized, donde los hilos concurrentes acceden a las condiciones variables.
synchronized int miMetodo();
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores: algoritmo del Productor-Consumidor
¿Secciones críticas...?
Productor
Consumidor
Contenedor
run()
run()
put(data)
get(): data
synchronized void put(data);
synchronized int get();
Thread
Thread
1.1 Sincronización de threads: monitores
eugeniaperez.es
1.1 Sincronización de threads: monitores
eugeniaperez.es
1.1 Sincronización de threads: monitores
eugeniaperez.es
Text
Descarga el repositorio:
Username: cuatrovientos
Password: Cuatrovientos
1.1 Sincronización de threads: monitores
eugeniaperez.es
Text
1.1 Sincronización de threads: monitores
eugeniaperez.es
Monitores
Tanto Productor como Consumidor utilizan un recurso compartido que se basa en el objeto contenedor de valores.
Es interesante que mientras se esté ejecutando el put nadie más tenga acceso a las variables propias del objeto.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Este mecanismo para gestionar bloqueos supone:
1.1 Sincronización de threads: monitores
eugeniaperez.es
Text
ENTREGA: UT3. Actividad 1 (pág. 85)
Modifica el ejemplo del Productor-Consumidor para
SUSTITUIR la clase Contenedor por una colección de la API de Java que ofrezca el mismo comportamiento.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Text
ENTREGA: UT3. Actividad 1 (pág. 85)
Pista: Echa un vistazo a la interfaz BlockingQueue y a
alguna de sus implementaciones que soporte sincronismo.
Es decir, investiga y busca de entre las posibles implementaciones de esta interfaz y elige
la que creas que más se adapta a este problema, eliminando
la clase Contenedor e instanciando esta nueva
implementación que utilizarán tanto el Productor como el Consumidor.
1.1 Sincronización de threads: monitores
eugeniaperez.es
Text
ENTREGA: UT3. Actividad 1 (pág. 85)
El objetivo de esta actividad es que NO REINVENTES LA RUEDA.
Debes acostumbrarte a utilizar las clases del API de Java que ya están desarrolladas para estos fines...
Al final tendrás un proyecto con 3 clases en lugar de 4 y el tratamiento de las secciones críticas será más eficiente...
REPASO
eugeniaperez.es
Text
API de Java:
Está organizada en paquetes lógicos, donde cada paquete contiene un conjunto de clases relacionadas de gran utilidad para los programadores.
Es un conjunto de clases que podemos utilizar para llevar a cabo tareas en nuestras aplicaciones.
Por tanto, es recomendable que antes de ponernos a escribir código, le echemos un vistazo a la API porque, a lo mejor, ya existe una clase que hace lo que pretendemos.
Debes acostumbrarte a utilizar las clases del API de Java que ya están desarrolladas para estos fines...
Al final tendrás un proyecto con 3 clases en lugar de 4 y el tratamiento de las secciones críticas será más eficiente...
REPASO
eugeniaperez.es
Text
JAVA COLLECTION FRAMEWORK (JCF)
Set de clases e interfaces de importante utilidad, en el paquete java.util, para el manejo de colecciones de objetos en Java.
Es decir, hasta ahora, cuando has hecho los ejercicios, y has necesitado una colección, es decir, un array o una lista, probablemente has utilizado tus propias soluciones. Por ejemplo, en el ejercicio del Productor-Consumidor, has utilizado una clase Contenedor, que no es más que un almacén en el que se van insertando y sacando elementos.gar de 4 y el tratamiento de las secciones críticas será más eficiente...
REPASO
eugeniaperez.es
Text
JAVA COLLECTION FRAMEWORK (JCF)
No obstante, esto NO suele ser necesario.
La ventaja es que:
REPASO
eugeniaperez.es
Text
JAVA COLLECTION FRAMEWORK (JCF)
Se organizan en:
REPASO
eugeniaperez.es
Text
La idea es buscar una implementación de la interfaz BlockingQueue, que sustituya a la clase Contenedor:
Productor
Consumidor