SlideShare una empresa de Scribd logo
Concurrencia en Java:
De Iniciado a Competente
Barcamp Santiago, Noviembre 18, 2017
Acerca de Mi.
Pedro J. González.
pjgonzalez@gmail.com
popxix
pjgonzalezdr
Tópicos:
● Thread, Runnable, Callable .
● Synchronized, Atomic.
● Future, ExecutorService.
● ThreadPool, ForkJoinPool
● ForkJoinTask.
● ParallelStream
● Amdhal’s Law
Recursos:
http://tutorials.jenkov.com/java-util-concurrent/index.html
http://www.linfo.org/context_switch.html
https://www.youtube.com/watch?v=HdnHmbFg_hw
https://github.com/popxix/barcamp
https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html
La Concurrencia….
Thread
● Es un Hilo de Ejecución de un App.
● La JVM permite a un App Java tener múltiples hilos corriendo
concurrente.
● Cada Thread tiene su prioridad.
● Formas de Crear Threads:
○ Extendiendo la clase Thread.
○ Implementando la Interfaz Runnable.
Is Code Time...
public class AnalizadorWebLogThread extends Thread {
….
public AnalizadorWebLogThread(final File archivo, Predicate<RegistroAcceso> filtro) { ..}
private boolean esValido() {...}
@Override
public void run() {
if(esValido()) {
try {analizaArchivo(Files.lines(archivo.toPath())); } catch
(IOException e) { ...}}
}
protected void analizaArchivo(Stream<String> streamArchivo) {
long total =
streamArchivo.map(AuxFunciones::analizadorLog).filter(filtro).count();
System.out.println(total + " Registros encontrados..");
}
public static void main(String[] args) {
AnalizadorWebLogThread analizadorWebLogThread = new
AnalizadorWebLogThread(archivo, filtro);
analizadorWebLogThread.start();
}
}
Comunicación inter-Thread
Comunicación entre threads sincronizados.
Se lleva a cabo durante el uso de los siguientes métodos de la clase Object:
● Wait(): Causa que el se invoque el bloqueo del thread actual.
● Notify(): Libera el bloqueo.
● NotifyAll()
Diferencia entre wait() y sleep()
wait()
● Libera el proceso de bloqueo.
● Pertenece a la clase Object.
● El bloqueo es liberado Luego de llamar
los métodos notify() y notifyAll()
Sleep()
● No libera bloqueo.
● Pertenece a la clase thread.
● El thread continua su ejecución
después del tiempo especificado.
Code Sample Again...
public class AnalizadorWebLog {
private List<RegistroAcceso> registros = new ArrayList<>();
public synchronized void analizaLog(File archivo) {
System.out.println("Cargando Archivos de log..");
this.registros = archivoALista(archivo,getFiltroIP("192.168.234.82"));
System.out.println("Fueron Cargados.." + registros.size() + " Registros");
notify();
}
public synchronized void insertaLogDB() {
if(registros.isEmpty()) {
System.out.println("No hay archivos procesados en este momento...");
try {wait();} catch (Exception e) {....}}
registros.stream().forEach(registro->{System.out.println(" Procesando el registro de la fecha: " +
registro.getFecha());});}
public static void main(String[] args) {
final AnalizadorWebLog analizadorWebLog = new AnalizadorWebLog();
Runnable dbTask = ()->{analizadorWebLog.insertaLogDB();};
new Thread(dbTask).start();
Runnable analizaTask = ()->{analizadorWebLog.analizaLog(logFile);};
new Thread(analizaTask).run();
}
}
MultiThreading Y Concurrencia
Beneficios
Aun con los retos que presenta la
concurrencia, más abajo se detallan algunos
de sus beneficios:
Que Gano?
● Mejor Utilización de Recursos.
● Diseño del programa más simple.*
● Programa más receptivo.
Sacrificios
Tiene sus costos, sin embargo los beneficios
son mayores que los sacrificios, más abajo se
detalla algunos de sus costos:
Cual es el Costo?
● Complejidad en el diseño.
● Cambio de Contexto.
● Incremento en el consumo de recursos.
Executors
Executors
Métodos Utilitarios y Factory las interfaces Executor, ExecutorService y
SchedulerExecutorService. Soporta el Siguiente tipo de métodos:
● Método que crea un y retorna un ExecutorService con la configuración más comunes.
● Método que crea un y retorna un ScheduledExecutorService con la configuración más comunes.
● Método que crea un y retorna un “wrapped” ExecutorService.
● Método que crea un y retorna un ThreadFactory.
● Método que crea un y retorna un Callable.
Executors
● ExecutorService singleExecutorService = Executors.newSingleThreadExecutor();
● ScheduledExecutorService singleScheduledExService = Executors.newSingleThreadScheduledExecutor();
● ExecutorService fixedExecutorService = Executors.newFixedThreadPool(10);
● ExecutorService onDemandExecutorService = Executors.newCachedThreadPool();
● ScheduledExecutorService fixedScheduledExecutorService = Executors.newScheduledThreadPool(5);
ExecutorService
Interfaz que provee un procesamiento asíncrono para la ejecución de tareas.
● shutdown(): permite terminar las tareas las tareas enviadas previo a la llamada del
método. Y no Acepta tareas nuevas.
● shutdownNow(): Evita que las tareas en espera inicien y trata de terminar las
tareas en ejecución.
● Produce un resultado del tipo Future.
Implementaciones:
➔ ThreadPoolExecutor.
Ejecuta la tarea dada (Callable, Runnable) utilizando uno de los Threads agrupados.
int corePoolSize = 5;
int maxPoolSize = 10;
long keepAliveTime = 5000;
ExecutorService threadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
ScheduledExecutorService
● Tipo de ExecutorService que puede ser utilizado para ejecutar tareas con un
retraso especificado o periódicamente.
● scheduleAtFixedRate y scheduleWithFixedDelay crean y ejecutan tareas que
corren de forma periódica hasta que son canceladas.
private final ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(1);
public void beepForAnHour() {
final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); } };
final ScheduledFuture<?> beeperHandle =scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); }}, 60 * 60, SECONDS);}
Future
● Representa el resultado pendiente de una operación Asíncrona.
Future<T> ExecutorService.submit(Callable <T> callable)
La llamada al método retorna inmediato pero se debe invocar get() para obtener
el resultado.
CompletableFuture
Implementa las siguientes interfaces:
➔ Future<T>: Resultado Pendiente en una operación asíncrona.
➔ CompletionStage<T>: Una promesa de que la operación en algún momento será completada.
Métodos:
➔ static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);
➔ static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor);
➔ static CompletableFuture<Void> runAsync(Runnable runnable);
➔ static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor);
Paralelismo
Solo Vale La pena
● Cuando las Operaciones son independientes y asociativas.
○ a op (b op c ) === ( a op) op c.
● Cuando hay muchos datos o se requiere mucho procesamiento por elementos.
○ N * Q > 10000
● Cuando los datos son fáciles de particionar.
Parallel Streams
try(Stream<String> cad = Files.lines(logFile.toPath())){
Long total =
cad.parallel().map(AuxFunciones::analizadorLog)
.filter(....).count();
Amdahl's law
Calculo de cuanto puede incrementar el rendimiento computacional si se corre en paralelo.
Llamada así por Gene Amdahl quien presentó la ley en 1967.
Formula:
T = B + (T-B)
Donde:
T=Tiempo total de la ejecución en serie.
B=Tiempo total de la parte no paralelizada.
T-B = Tiempo de la parte paralelizada (cuando se ejecuta en serie)
Entonces para medir la velocidad de ejecución de la parte paralelizada expresamos:
(T-B) / N
Donde:
N= Número de Threads o CPU (Factor de Paralelización).
This Is The End...

Más contenido relacionado

La actualidad más candente

Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJS
Javier Abadía
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Codemotion
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0
Luis Ruiz Pavón
 
Taller de Introducción a Scripting con gvSIG
Taller de Introducción a Scripting con gvSIGTaller de Introducción a Scripting con gvSIG
Taller de Introducción a Scripting con gvSIG
Óscar Martínez Olmos
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
Jobsket
 
Servicios en Zend Framework 2
Servicios en  Zend Framework 2Servicios en  Zend Framework 2
Servicios en Zend Framework 2El Taller Web
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printer
nanusefue
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
Micael Gallego
 
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
Iván López Martín
 
Del infierno al cielo
Del infierno al cieloDel infierno al cielo
Del infierno al cielo
Raúl Requero García
 
Compilar y Debug en Android
Compilar y Debug en AndroidCompilar y Debug en Android
Compilar y Debug en Android
Barcelona GTUG
 
Guia final so
Guia final soGuia final so
Guia final so
puracastillo
 
Microservicios, en qué lío me he metido
Microservicios, en qué lío me he metidoMicroservicios, en qué lío me he metido
Microservicios, en qué lío me he metido
Ernesto Hernández Rodríguez
 
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerCodemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Iván López Martín
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
Agencia INNN
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
Agencia INNN
 
Openmp
OpenmpOpenmp
Openmp
Unex
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas ForensesConferencias FIST
 
Glpk+java+windows
Glpk+java+windowsGlpk+java+windows
Glpk+java+windows
Josue Zarzosa
 

La actualidad más candente (20)

Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJS
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
 
.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0.NET Core 1.0 y ASP.NET Core 1.0
.NET Core 1.0 y ASP.NET Core 1.0
 
Taller de Introducción a Scripting con gvSIG
Taller de Introducción a Scripting con gvSIGTaller de Introducción a Scripting con gvSIG
Taller de Introducción a Scripting con gvSIG
 
Jobsket Spring 2GX Madrid
Jobsket Spring 2GX MadridJobsket Spring 2GX Madrid
Jobsket Spring 2GX Madrid
 
Servicios en Zend Framework 2
Servicios en  Zend Framework 2Servicios en  Zend Framework 2
Servicios en Zend Framework 2
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printer
 
TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2TypeScript - Angular 2 - ionic 2
TypeScript - Angular 2 - ionic 2
 
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...
 
Del infierno al cielo
Del infierno al cieloDel infierno al cielo
Del infierno al cielo
 
Compilar y Debug en Android
Compilar y Debug en AndroidCompilar y Debug en Android
Compilar y Debug en Android
 
Guia final so
Guia final soGuia final so
Guia final so
 
Microservicios, en qué lío me he metido
Microservicios, en qué lío me he metidoMicroservicios, en qué lío me he metido
Microservicios, en qué lío me he metido
 
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerCodemotion 2013 - Quiero tiempo real y lo quiero para ayer
Codemotion 2013 - Quiero tiempo real y lo quiero para ayer
 
Deployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevillaDeployer PHP. Presentación para #PHPSevilla
Deployer PHP. Presentación para #PHPSevilla
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
 
Gulp js php sevilla 28 septiembre 2016
Gulp js   php sevilla 28 septiembre 2016Gulp js   php sevilla 28 septiembre 2016
Gulp js php sevilla 28 septiembre 2016
 
Openmp
OpenmpOpenmp
Openmp
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas Forenses
 
Glpk+java+windows
Glpk+java+windowsGlpk+java+windows
Glpk+java+windows
 

Similar a Concurrencia en Java

Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephpbetabeers
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
Andy Dawson
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
Paradigma Digital
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
Luis Ruiz Pavón
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
BEEVA_es
 
Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Expressbetabeers
 
JVM Reactive Programming
JVM Reactive ProgrammingJVM Reactive Programming
JVM Reactive Programming
Domingo Suarez Torres
 
Java Script Frame Works
Java Script Frame WorksJava Script Frame Works
Java Script Frame Works
hectorguedea
 
Programación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con AsincronismosProgramación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con Asincronismos
Víctor Bolinches
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
Eudris Cabrera
 
Introducción a Angular
Introducción a AngularIntroducción a Angular
Introducción a Angular
Pedro J. Molina
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
Alberto Diaz Martin
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
Alberto Diaz Martin
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
Jose Emilio Labra Gayo
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
Fernando Petrola
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
Rodrigo Pimentel
 
PHP Unit y TDD
PHP Unit y TDDPHP Unit y TDD
PHP Unit y TDD
Emergya
 
Django
DjangoDjango
Django
ykro
 
Algoritmos - Funciones C++
Algoritmos - Funciones C++ Algoritmos - Funciones C++
Algoritmos - Funciones C++ Ronal Palomino
 

Similar a Concurrencia en Java (20)

Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Java 8 time to join the future
Java 8  time to join the futureJava 8  time to join the future
Java 8 time to join the future
 
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7ReConnect 2015  - ASP.NET 5: MVC 6 y EF 7
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
 
Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Express
 
JVM Reactive Programming
JVM Reactive ProgrammingJVM Reactive Programming
JVM Reactive Programming
 
Java Script Frame Works
Java Script Frame WorksJava Script Frame Works
Java Script Frame Works
 
Programación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con AsincronismosProgramación Funcional y Orientada a Objetos con Asincronismos
Programación Funcional y Orientada a Objetos con Asincronismos
 
Java8 : Más allá de las Expresiones Lambdas
Java8 :  Más allá de las Expresiones LambdasJava8 :  Más allá de las Expresiones Lambdas
Java8 : Más allá de las Expresiones Lambdas
 
Introducción a Angular
Introducción a AngularIntroducción a Angular
Introducción a Angular
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014 Dragome en JavaConf Buenos Aires 2014
Dragome en JavaConf Buenos Aires 2014
 
Probando aplicaciones AngularJS
Probando aplicaciones AngularJSProbando aplicaciones AngularJS
Probando aplicaciones AngularJS
 
PHP Unit y TDD
PHP Unit y TDDPHP Unit y TDD
PHP Unit y TDD
 
Django
DjangoDjango
Django
 
Algoritmos - Funciones C++
Algoritmos - Funciones C++ Algoritmos - Funciones C++
Algoritmos - Funciones C++
 

Último

Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
juanjosebarreiro704
 
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
cuentauniversidad34
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
juanorejuela499
 
trabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docxtrabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docx
lasocharfuelan123
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
nicromante2000
 
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA  DE TRABAJO DE CREACION DE TABLAS EN WORDFICHA  DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
RobertSotilLujn
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
SamuelGampley
 
Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
Ecaresoft Inc.
 
Los desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMsLos desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMs
Federico Toledo
 
infografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de softwareinfografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de software
oscartorres960914
 

Último (10)

Maquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdfMaquina de Dibujo y Escritura Automática.pdf
Maquina de Dibujo y Escritura Automática.pdf
 
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...experiencia de aprendizaje sobre lectura y escritura como  herramientas de ap...
experiencia de aprendizaje sobre lectura y escritura como herramientas de ap...
 
PitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitalesPitchCollabART uniendo talentos, creando maravillas digitales
PitchCollabART uniendo talentos, creando maravillas digitales
 
trabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docxtrabajo integrador final sofi y vane.docx
trabajo integrador final sofi y vane.docx
 
Escaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipoEscaneo y eliminación de malware en el equipo
Escaneo y eliminación de malware en el equipo
 
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA  DE TRABAJO DE CREACION DE TABLAS EN WORDFICHA  DE TRABAJO DE CREACION DE TABLAS EN WORD
FICHA DE TRABAJO DE CREACION DE TABLAS EN WORD
 
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJECONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
CONCEPTOS DE PROGRAMACION CUALQUIER LENGUAJE
 
Caso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La SalleCaso de exito Cirrus - Hospital La Salle
Caso de exito Cirrus - Hospital La Salle
 
Los desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMsLos desafíos de calidad de software que nos trae la IA y los LLMs
Los desafíos de calidad de software que nos trae la IA y los LLMs
 
infografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de softwareinfografia del sena para analisis y desarrollo de software
infografia del sena para analisis y desarrollo de software
 

Concurrencia en Java

  • 1. Concurrencia en Java: De Iniciado a Competente Barcamp Santiago, Noviembre 18, 2017
  • 2. Acerca de Mi. Pedro J. González. pjgonzalez@gmail.com popxix pjgonzalezdr
  • 3. Tópicos: ● Thread, Runnable, Callable . ● Synchronized, Atomic. ● Future, ExecutorService. ● ThreadPool, ForkJoinPool ● ForkJoinTask. ● ParallelStream ● Amdhal’s Law
  • 6. Thread ● Es un Hilo de Ejecución de un App. ● La JVM permite a un App Java tener múltiples hilos corriendo concurrente. ● Cada Thread tiene su prioridad. ● Formas de Crear Threads: ○ Extendiendo la clase Thread. ○ Implementando la Interfaz Runnable.
  • 8. public class AnalizadorWebLogThread extends Thread { …. public AnalizadorWebLogThread(final File archivo, Predicate<RegistroAcceso> filtro) { ..} private boolean esValido() {...} @Override public void run() { if(esValido()) { try {analizaArchivo(Files.lines(archivo.toPath())); } catch (IOException e) { ...}} } protected void analizaArchivo(Stream<String> streamArchivo) { long total = streamArchivo.map(AuxFunciones::analizadorLog).filter(filtro).count(); System.out.println(total + " Registros encontrados.."); } public static void main(String[] args) { AnalizadorWebLogThread analizadorWebLogThread = new AnalizadorWebLogThread(archivo, filtro); analizadorWebLogThread.start(); } }
  • 9. Comunicación inter-Thread Comunicación entre threads sincronizados. Se lleva a cabo durante el uso de los siguientes métodos de la clase Object: ● Wait(): Causa que el se invoque el bloqueo del thread actual. ● Notify(): Libera el bloqueo. ● NotifyAll()
  • 10. Diferencia entre wait() y sleep() wait() ● Libera el proceso de bloqueo. ● Pertenece a la clase Object. ● El bloqueo es liberado Luego de llamar los métodos notify() y notifyAll() Sleep() ● No libera bloqueo. ● Pertenece a la clase thread. ● El thread continua su ejecución después del tiempo especificado.
  • 12. public class AnalizadorWebLog { private List<RegistroAcceso> registros = new ArrayList<>(); public synchronized void analizaLog(File archivo) { System.out.println("Cargando Archivos de log.."); this.registros = archivoALista(archivo,getFiltroIP("192.168.234.82")); System.out.println("Fueron Cargados.." + registros.size() + " Registros"); notify(); } public synchronized void insertaLogDB() { if(registros.isEmpty()) { System.out.println("No hay archivos procesados en este momento..."); try {wait();} catch (Exception e) {....}} registros.stream().forEach(registro->{System.out.println(" Procesando el registro de la fecha: " + registro.getFecha());});} public static void main(String[] args) { final AnalizadorWebLog analizadorWebLog = new AnalizadorWebLog(); Runnable dbTask = ()->{analizadorWebLog.insertaLogDB();}; new Thread(dbTask).start(); Runnable analizaTask = ()->{analizadorWebLog.analizaLog(logFile);}; new Thread(analizaTask).run(); } }
  • 13. MultiThreading Y Concurrencia Beneficios Aun con los retos que presenta la concurrencia, más abajo se detallan algunos de sus beneficios: Que Gano? ● Mejor Utilización de Recursos. ● Diseño del programa más simple.* ● Programa más receptivo. Sacrificios Tiene sus costos, sin embargo los beneficios son mayores que los sacrificios, más abajo se detalla algunos de sus costos: Cual es el Costo? ● Complejidad en el diseño. ● Cambio de Contexto. ● Incremento en el consumo de recursos.
  • 15. Executors Métodos Utilitarios y Factory las interfaces Executor, ExecutorService y SchedulerExecutorService. Soporta el Siguiente tipo de métodos: ● Método que crea un y retorna un ExecutorService con la configuración más comunes. ● Método que crea un y retorna un ScheduledExecutorService con la configuración más comunes. ● Método que crea un y retorna un “wrapped” ExecutorService. ● Método que crea un y retorna un ThreadFactory. ● Método que crea un y retorna un Callable.
  • 16. Executors ● ExecutorService singleExecutorService = Executors.newSingleThreadExecutor(); ● ScheduledExecutorService singleScheduledExService = Executors.newSingleThreadScheduledExecutor(); ● ExecutorService fixedExecutorService = Executors.newFixedThreadPool(10); ● ExecutorService onDemandExecutorService = Executors.newCachedThreadPool(); ● ScheduledExecutorService fixedScheduledExecutorService = Executors.newScheduledThreadPool(5);
  • 17. ExecutorService Interfaz que provee un procesamiento asíncrono para la ejecución de tareas. ● shutdown(): permite terminar las tareas las tareas enviadas previo a la llamada del método. Y no Acepta tareas nuevas. ● shutdownNow(): Evita que las tareas en espera inicien y trata de terminar las tareas en ejecución. ● Produce un resultado del tipo Future.
  • 18. Implementaciones: ➔ ThreadPoolExecutor. Ejecuta la tarea dada (Callable, Runnable) utilizando uno de los Threads agrupados. int corePoolSize = 5; int maxPoolSize = 10; long keepAliveTime = 5000; ExecutorService threadPoolExecutor = new ThreadPoolExecutor( corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
  • 19. ScheduledExecutorService ● Tipo de ExecutorService que puede ser utilizado para ejecutar tareas con un retraso especificado o periódicamente. ● scheduleAtFixedRate y scheduleWithFixedDelay crean y ejecutan tareas que corren de forma periódica hasta que son canceladas. private final ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(1); public void beepForAnHour() { final Runnable beeper = new Runnable() { public void run() { System.out.println("beep"); } }; final ScheduledFuture<?> beeperHandle =scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS); scheduler.schedule(new Runnable() { public void run() { beeperHandle.cancel(true); }}, 60 * 60, SECONDS);}
  • 20. Future ● Representa el resultado pendiente de una operación Asíncrona. Future<T> ExecutorService.submit(Callable <T> callable) La llamada al método retorna inmediato pero se debe invocar get() para obtener el resultado.
  • 21. CompletableFuture Implementa las siguientes interfaces: ➔ Future<T>: Resultado Pendiente en una operación asíncrona. ➔ CompletionStage<T>: Una promesa de que la operación en algún momento será completada. Métodos: ➔ static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier); ➔ static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor); ➔ static CompletableFuture<Void> runAsync(Runnable runnable); ➔ static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor);
  • 23. Solo Vale La pena ● Cuando las Operaciones son independientes y asociativas. ○ a op (b op c ) === ( a op) op c. ● Cuando hay muchos datos o se requiere mucho procesamiento por elementos. ○ N * Q > 10000 ● Cuando los datos son fáciles de particionar.
  • 24. Parallel Streams try(Stream<String> cad = Files.lines(logFile.toPath())){ Long total = cad.parallel().map(AuxFunciones::analizadorLog) .filter(....).count();
  • 25. Amdahl's law Calculo de cuanto puede incrementar el rendimiento computacional si se corre en paralelo. Llamada así por Gene Amdahl quien presentó la ley en 1967. Formula: T = B + (T-B) Donde: T=Tiempo total de la ejecución en serie. B=Tiempo total de la parte no paralelizada. T-B = Tiempo de la parte paralelizada (cuando se ejecuta en serie) Entonces para medir la velocidad de ejecución de la parte paralelizada expresamos: (T-B) / N Donde: N= Número de Threads o CPU (Factor de Paralelización).
  • 26. This Is The End...

Notas del editor

  1. http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/
  2. Parallel computing involves dividing a problem into subproblems, solving those problems simultaneously (in parallel, with each subproblem running in a separate thread), and then combining the results of the solutions to the subproblems. Java SE provides the fork/join framework, which enables you to more easily implement parallel computing in your applications. However, with this framework, you must specify how the problems are subdivided (partitioned). With aggregate operations, the Java runtime performs this partitioning and combining of solutions for you. One difficulty in implementing parallelism in applications that use collections is that collections are not thread-safe, which means that multiple threads cannot manipulate a collection without introducing thread interference or memory consistency errors. The Collections Framework provides synchronization wrappers, which add automatic synchronization to an arbitrary collection, making it thread-safe. However, synchronization introduces thread contention. You want to avoid thread contention because it prevents threads from running in parallel. Aggregate operations and parallel streams enable you to implement parallelism with non-thread-safe collections provided that you do not modify the collection while you are operating on it. Note that parallelism is not automatically faster than performing operations serially, although it can be if you have enough data and processor cores. While aggregate operations enable you to more easily implement parallelism, it is still your responsibility to determine if your application is suitable for parallelism. This section covers the following topics: https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html para el resumen. https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html