Bienvenidos.
Continuamos con los hilos o los Drizzt en Yaba.
Bueno, qué es lo que son?
Son objetos?
Son instancia de una clase, la clase Grid, que nos da la capacidad de hacer más de una tarea al mismo
tiempo.
Pero bueno, va a depender también un poco.
Por qué ha ido a concepto importante uno?
La concurrencia y el paralelismo que depender también de nuestro procesador de la CPU ni de la cantidad
de Kord que maneja.
Por ejemplo, si en multicolor.
Bueno, se aprovecha al 100 porciento de características y sería paralelismo que se van a ejecutar estos
proceso.
Esta tarea 100 por ciento en paralelo.
Mientras que la concurrencia.
Si tenemos un solo KOR en nuestra CPU va a manejar de forma concurrente, es decir, una tarea primero,
después otra y va a ir alternando, pero visualmente para el usuario va a ser como si se ejecutará todo
al mismo tiempo se van a ir intercalando.
Hoy en día la gran mayoría de las CPU son multicolor, se trabajan 100 por ciento en paralelo y es por
eso que Yaveh implementa te característica.
Uno de los componentes más importante en Yaba Kie también nos permite acelerar nuestras aplicaciones,
trabajar de forma quizá más reactiva, también nos permite trabajar de forma asíncrona.
En fin, cosas que vamos a ver, pero también podemos sincronizar estos hilos y dar seguridad para que
entren, por ejemplo a un método, a un recurso de forma ordenada de HA1 sincronizada, o bien todo
al mismo tiempo como creo manejar.
Pero hay que tener cuidado porque si tenemos un recurso donde ingresan muchos hilos al mismo tiempo,
uno podría modificar algún dato, algún atributo variable y eso también podría afectar al resto de los
hilos que están consumiendo ese recurso y podría quedar ambigua.
Se fijan entonces que tener cuidado en ese sentido cuando es compartido es mejor de repente sincronizar,
sobre todo si se maneja algún estado en la variable, alguna información que compartía.
Pero bien, continuemos.
Bueno, la máquina toldilla es un sistema multi herid capaz de ejecutar varias tareas al mismo tiempo
que son subprogramas simultáneamente, que hay que hacer una diferencia porque tenemos procesos y hilos.
Por ejemplo, una aplicación en Java con el método main se ejecuta en un proceso, pero un proceso podría
tener varios hilos al mismo tiempo.
Entonces, bueno, también podemos tener varios aplicaciones de Java que se ejecutan al mismo tiempo
y cada una está aplicaciones también tiene su propio hilo.
Claro, y ahí tenemos varias tareas, varios procesos, hilos simultáneos.
Java soporta grid hilo con algunas clases interface que vamos a ver, por ejemplo adrid razonable y
además método específico de la clase Option que para sincronizar y comunicarse unos Dredd con otro método
como wait para liberar el monitor para liberar el recurso método notify o notify all para notificar
al resto para que despierten y puedan acceder al recurso.
En fin, lo vamos a ver.
Entonces, en resumen, la máquina virtual de Java por supuesto que trabaja sobre este tema operativo,
pero a su vez es similar a la forma como gestiona los recursos, como lo hace un sistema operativo,
por ejemplo.
Entonces así la memoria, tiempo de ejecución, en fin, prioridades.
Veamos un ejemplo simple de un tren.
Después con los ejemplo, obviamente lo vamos a detallar, pero hay dos formas de crear un tried.
Uno es extender la clase de por ejemplo cálculo de red hereda de la clase Drizzt de Java e implementamos
el método Rahn y listo.
Hoy tenemos nuestro delin luego en una clase con el método Main.
En algún proceso podríamos ejecutar este Dredd con el método Start.
También hay que tener en cuenta de que lo ADRID son tareas que se ejecutan dentro de un proceso dentro
de una aplicación y también tiene un principio, un final igual que el método main, que un proceso
tiene una secuencia o un flujo de programa.
Por lo tanto, tienen comienzo y un fin.
De hecho, el método main se ejecuta en un grid también, que es el thread principal.
Y en el caso del grid, todo ocurre dentro del método Rrán.
Entonces, cuando comienza, cuando arranca el método Rrán, comienza este hilo y a finalizar.
Bueno, finaliza el hilo, queda conectado, termina Hatter.
He terminado o muerto, por así decir.
Bueno, y cómo se ejecuta el run?
Porque el run no se llama nunca se va a invocar de forma explícita en nuestro código siempre se invoca
por debajo utilizando el método Start del tried, tal como vemos acá abajo.
Entonces se crea la instancia calculo adrid.
Le invocamos el estar y el estar por debajo.
Invoca el rango y comienza la secuencia, el proceso de este hilo, lo que tienes que hacer y así como
se está ejecutando calculo adrid.
En el proceso del método main podemos tener mucho más hilo que se ejecutan de forma paralela o concurrente,
pero tenemos otra forma que es más desacoplar ya que más recomendada también que a través de la implementación
de la interfaz RAMEY.
Acá tenemos una tarea implemente Rand Table y también implementamos el método Rrán.
Y lo mismo dentro del Rrán.
Ejecutamos nuestra tarea, lo que tenemos que hacer una consulta flasheado, por ejemplo, leer algún
archivo de recurso o alguna comunicación con API rest utilizando un cliente HTTP o lo que sea necesario
y cómo implementamos este?
Simplemente creamos un Drizzt con el new y por constructor le pasamos esta implementación de la interfaz
Ranavalona, es decir, new tarea, y también con el start se comienza importante.
Por qué es preferible utilizar Ranavalona versus la forma anterior heredando de diría claro, porque
por ejemplo, Cálculo adrid podríamos necesitar que herede de otra clase, pero al heredar de grid ya
me permite tenderte otra clase.
Entonces queda muy acoplada siempre a que tiene que heredar de deride y no la podemos utilizar dentro
de una jerarquía de clases.
Se fijan que muy acoplado una implementación mientres con la interfaz no?
Bueno, y esa clase podría heredar de cualquier otra clase.
No es cierto?
Y además implementar el método Rrán utilizando interfaz redneck es mucho más limpio y también es compatible
conlleva 8 con todo lo que programación funcional expresiones lanta que también lo vamos a ver.
Continuemos con el ciclo de vida de un Drizzt.
Vamos a pÃrtico en el ciclo cuando parte nuevo new.
Entonces simplemente cuando se crea una nueva instancia de un tren, por ejemplo New adrid, le pasamos
el rey naive y simplemente creamos la instancia sin invocar el método obstat porque todavía no ha comenzado.
Solamente creamos un odre y ni siquiera se le asigno recurso.
Continuamos con el siguiente ciclo de vida que sería Rodney está en estado ejecutable.
Bueno, y esto ocurre cuando se invoca el método tarto, es decir, cuando se ha iniciado el tri.
Veamos qué otro estado tenemos?
Bueno, bloqueado.
Un hilo que está en este estado no está actualmente capacitado para ejecutarse.
Está en standby, por así decir, no es elegible para ejecutarse entre este estado cuando está esperando
un bloqueo del monitor.
Bueno, pero qué es lo que se monitor?
Un objeto, un recurso compartido con otros berith?
Es decir, hay varios dirig que están accediendo a un objeto compartido y en ese instante hay ocho drid
que está utilizando este método sincronizado.
Entonces, cuando intenta acceder a una sección de código que ya está siendo utilizada por otro adrid,
en algún método sincronizado se indica que está bloqueado.
Tiene que esperar a que otro adrid libere o se salga de este método sincronizada.
Por ejemplo, acá tenemos un Rann Ivailo con una forma prisión Landa utilizando ya 8.
Entonces, en vez de implementar una clase que implementa interfaz Honeywell, la podemos crear al vuelo
como clase anónima.
Una forma, pero mucho mejor también utilizando expresiones lambda.
Entonces, dentro del método rrán de este ejecutable invoca un recurso el método recurso que sincronizado.
Por lo tanto tiene el modificador sincronice da seguridad a los shilo, es decir, ingresan de a uno
turalmente de a uno.
Un hilo no puede ingresar si está tomado por otro hilo, por ejemplo.
Bien ata tan claro.
Luego creamos dos hilos, le pasamos el rato libre con la tarea para acceder a este recurso sincronizado
y los dos comienzan, pero el TI1 comienza primero que el T2 y si se fijan acá tenemos para simular
una carga, un trabajo pesado.
En este recurso hacemos un while infinito.
Entonces constru va a estar ejecutando.
Por lo tanto el primer grid entra recurso y lo toma y queda infinitamente dentro este método.
Entonces, cuando el segundo comienza después del primer drip acá en start.
Bueno, ya está tomado.
Hacemos una pausa de 1000 mele segundo, es decir, de un segundo y obtenemos el estado del segundo
delay que no puede entrar.
Quiere entrar a recursos, pero no puede entrar porque está bloqueado por el primero.
En un loop infinito se aplica.
Bueno, este ejemplo es extremo en el fondo para simular una gran consulta, por ejemplo a una base,
datos o leer un archivo y realizar un proceso bastante complejo y pesado.
Continuemos.
Veamos otro más.
Waiting esperando entonces un hilo está en el estado watching cuando está esperando a que otro hilo
realice una acción en particular.
Pero hay dos formas.
Puede ocurrir que un hilo entre a este estado llamando cualquiera de estos dos métodos.
Por ejemplo, método wait y jeune.
El ejemplo apartÃ así.
Acá tenemos el Dredd principal de uno en el método Main.
Entonces es el hilo principal del método Main, que además ejecuta otro hilo.
Entonces el principal del método Main ejecuta el tedos.
Por lo tanto, el TVE2 el dos estanqueidad o dentro del método main del Dredd actual.
Por eso invocamos de la clase Dirig el método Carran Dredd, es decir, el dret actual y el Segundo
Dredd.
Lo que hace es hacer una pausa de cinco segundos acá 5000 milisegundos hace una pausa acá requiere manejar
interrup de deception y acá imprimimos el drid principal del método Main.
El TI1 se fija en Ti1 guet State.
Entonces imprime molestado con este método dentro del Drift 2 y va a indicar que el Dredd principal
del método Main está esperando ahora.
Por qué ocurre eso?
Claro, porque se inicia el Trib 2 y luego Yeung se une al try principal.
Entonces, cuando se une el thread principal se bloquea o make se bloquea.
Queda esperando a que finalice este segundo Dorit para poder continuar con su equipo.
Porque recuerdan el Drizzt votan Idaho dentro del Dredd 1.
El principal, entonces cuando se juntan con el jeune, tiene que esperar a que termine primero el que
está Idaho.
En este caso el 2 y luego continúa Termínate.
Este es el estado de un hilo que ha finalizado.
Ya está muerto.
Entonces, en este estado puede ocurrir de dos forma.
Cuando finaliza la ejecución es cuando se salió del método Rrán.
Finalizó Eldred.
O bien terminó de forma abrupta.
Anormal.
Se canceló.
Por ejemplo.
O mediante alguna acepción.
Lo que sea y esto pudiesse.
Con el método stop.
Pero el método stop del Dredd está de precaver y no se recomienda porque en realidad cuando se detiene
un grid con el stop lo termina de forma abrupta y podría quedar inconcluso.
El procesamiento de los datos o la tarea que está ejecutando este HERID.
Entonces nuestra aplicación podría quedar ambigua.
Por ejemplo, si estuvimos revisando cálculo sensible, el stop deja el programa en un estado inconsistente.
Lo ideal, en vez de llamar el método Stop, sería mucho mejor tener alguna bandera que indique que
el método Run debería salir entonces dentro del Dredd, alguna bandera true o false, y de esa forma
lo hacemos de una forma más controlada y que los datos no queden inconsistente.
Eso es lo importante.
También tenemos método Is a life.
Es cierto que true o false si es true es porque todavía está vivo.
Eldred no ha finalizado su ejecución.
Método Wait Notify y notify oll.
La clase Object tiene estos tres métodos que permiten que los hilos se puedan comunicar entre sí y se
sincronizan, sobre todo cuando están accediendo a un recurso compartido.
Por lo tanto, cuando ingresa un tried a un recurso compartido, este método que ha bloqueado y siempre
se utilizan estos tres métodos en un método sincronizado, es decir, que tenga el modificador sincronicen.
Eso es importante y lo que hace el método wait liberar el bloqueo para que otro hilo tenga la oportunidad
de acceder a este recurso.
Es decir, lo deja como a disposición y luego este que libera este recurso queda esperando indefinidamente
hasta que otro Drizzt acceda a este recurso y luego llame a los métodos notify o notify all que para
notificar es para despertar a él o los hilos que están esperando.
Y eso lo vamos a ver después más en detalle.
Así que no se preocupen.
Vamos a ver ejemplos sobre estos tres métodos.
También tenemos métodos D.E.P que lo que hace es pasar el hilo durante algún tiempo, en milisegundos
o en segundos, como queramos y que sea ejecutado Taime Waiting, es decir, esperando pero con un límite
de tiempo.
Es como hacer una pausa.
Y bueno, por supuesto que a diferencia del wait y el wait bueno, libera el recurso, pero también
libera el objeto el monitor, mientras que el sleep no y sigue consumiendo recurso.
Sigue tomado este método o este recurso, pero con una pausa a tiempo.
Entonces permanece dormido hasta que el tiempo expire.
O bien se llama el método interrup.
Ya tenemos un ejemplo donde tenemos un grid.
Acá estamos pasando mediante constructor, una implementación ternidad utilizando Java 8 e presiona
el lambda y acá hacemos un es lieb de 5000.
Por ejemplo, alguna una tarea costosa, pesada de 5 segundos o una consulta.
Las eato.
Por ejemplo, comenzamos el dret y hacemos una pausa más corta, por ejemplo de 1000.
Por lo tanto ya lleva 1000.
Le faltan 4000 para finalizar y como está en Sleep va a mostrar este estado cuando en vamos el método
Get State del T 1 el Drizzt 1 por qué está durmiendo?
Y por último mencionar porque la verdad es que no le quiero ver car en una presentación porque muy amplio
existe el framework executar service o servicio ejecutor, que después lo vamos a ver también con ejemplo
que para la ejecución de Dredd de tareas concurrentes, pero manejando un pool de hilos de grid y bueno,
tiene muchas implementaciones para distintos casos escenario.
Pero su ventaja.
Bueno, aparte de proveer un pool de drid que podemos utilizar, se encarga de manejar completamente
estos hilos.
Estos Dredd nunca vamos a crear una instancia de dirig y lo que hace básicamente reutilizar grid que
ya están disponibles y no crear grid nuevo utilizando recursos.
Porque recuerden que crear una instancia de un Tirith es costoso, finalmente crear un recurso del sistema.
Entonces lo que hace optimizar ese trabajo reutiliza, utiliza lo que están disponible al final de esa
copla la creación y el manejo de los grid de los procesos.
Continuamos en la siguiente clase.