Este documento presenta una introducción a la concurrencia en Java, incluyendo temas como threads, Runnable, Callable, synchronized, Atomic, Future, ExecutorService, ThreadPool, ForkJoinPool, ForkJoinTask, ParallelStream y la ley de Amdahl. Proporciona código de ejemplo para ilustrar el uso de threads, comunicación entre threads, Executors y CompletableFuture. El objetivo es llevar al lector de principiante a competente en conceptos básicos de concurrencia en Java.
An introductory talk to VCS. Learn the basics of git through a series of actual every-day usage & how-to use it to make your workflow more efficient.
As presented on DevConChile 2015
---
Una charla introductoria a los sistemas de control de versiones (VCS). Aprende lo básico de git a través de una serie de ejemplos de uso real y cómo puedes intregrarlo a tu entorno de trabajo para hacerlo más eficiente.
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
02/03/2017
Charla Universidad Politécnica de Valencia - https://www.upv.es/
Asingnatura : Auditoria, Calidad y Gestion de Sistemas de Información (ACG)
Máster Universitario en Ingeniería Informática - https://www.upv.es/titulaciones/MUIINF/
Transparencias de la charla con la que participamos en las III Jornadas de Java de Alicante.
En las transparencias se muestran algunas herramientas para implantar metodologías ágiles en Java y se comentan algunas anécdotas e historias de diferentes implantaciones.
An introductory talk to VCS. Learn the basics of git through a series of actual every-day usage & how-to use it to make your workflow more efficient.
As presented on DevConChile 2015
---
Una charla introductoria a los sistemas de control de versiones (VCS). Aprende lo básico de git a través de una serie de ejemplos de uso real y cómo puedes intregrarlo a tu entorno de trabajo para hacerlo más eficiente.
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
02/03/2017
Charla Universidad Politécnica de Valencia - https://www.upv.es/
Asingnatura : Auditoria, Calidad y Gestion de Sistemas de Información (ACG)
Máster Universitario en Ingeniería Informática - https://www.upv.es/titulaciones/MUIINF/
Transparencias de la charla con la que participamos en las III Jornadas de Java de Alicante.
En las transparencias se muestran algunas herramientas para implantar metodologías ágiles en Java y se comentan algunas anécdotas e historias de diferentes implantaciones.
Slides for my talk in FrontFest 2018 (Madrid, Feb 17). It's a technical comparison of the change detection mechanism as implemented in AngularJS, React, Angular2 and VueJS
See demos at https://github.com/jabadia/frontfest-frameworks-demos
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018 Codemotion
GraalVM es una nueva tecnología creada por Oracle para la JVM que permite convertirse además en una máquina virtual "universal", permitiendo ejecutar código de JS, Python, Ruby, C, C++ o R. Jerónimo nos hará una introducción a GraalVM: - como reemplazo del JIT de Java - para generar ejecutables ultrarápidos de Java sin necesitar la JRE - para ejecutar otros lenguajes contándonos sus bondades y sus actuales limitaciones.
Find out more presentations at https://madrid2018.codemotionworld.com/speakers/
Taller realizado durante las 13as Jornadas Internacionales gvSIG en Valencia y las 4as Jornadas gvSIG de México. Explica las funcionalidades básicas del módulo de programación y un ejemplo de manejo de datos e inserción de un geoproceso en la Toolbox.
This is the presentation we gave at Spring 2GX Madrid. It shows how Grails helped us to improve our productivity and why Grails is not that bounded to Groovy and how it can be an outstanding alternative if you are a 100% Java company.
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...Iván López Martín
Slides de mi charla de Greach 2013: "Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails"
Video de la charla: http://greach.es/sessions-2013/ivan-lopez-martin-todo-lo-que-me-hubiera-gustado-saber-cuando-empece-a-desarrollar-con-grails
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerIván López Martín
Slides de mi charla de Codemotion "http://codemotion.es/talk/19-october/88". El código fuente de las demos está disponible es https://github.com/lmivan/codemotion-2013.
El vídeo de repetción de la charla en @madridgug está disponible en: http://www.youtube.com/watch?v=dkDub1QLqmM
En un mundo hiper-conectado el concepto Tiempo Real es cada vez más utilizado y las arquitecturas "message driven" son la manera de conseguirlo porque permiten crear aplicaciones modulares y escalables.
En esta charla veremos un tipo de arquitectura totalmente distinta a la estandar de Grails para aplicaciones web que nos permitirá servir contenido en tiempo real a muchos clientes de manera rápida y sencilla teniendo distintos módulos independientes que interactuarán entre sí.
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
Presentación que nuestro compañero Álex Martín (@Alexdw) realizó para evento de la comunidad PHP Sevilla titulado ‘Gulp & Deployer working with Symfony’.
Este evento se celebró el pasado 28 de septiembre de 2016 en las oficinas de Innn. #SomosINNN #PHPSevilla
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia
Airflow by Airbnb: Describir, temporizar y monitorizar flujos de trabajo basados en Python.
Introducción a los conceptos generales de Airflow con el fin de conocer el potencial y las capacidades que ofrece este nuevo “smart cron" basado en Python. Overview y primeros pasos para la utilización de la plataforma
Gulp js php sevilla 28 septiembre 2016Agencia INNN
Presentación que nuestro compañero Juan Luis García (@JuanluGarcíaB) realizó para evento de la comunidad PHP Sevilla titulado ‘Gulp & Deployer working with Symfony’.
Este evento se celebró el pasado 28 de septiembre de 2016 en las oficinas de Innn. #SomosINNN #PHPSevilla
Con esta guía rápida pretendo ahorrar algo de tiempo a aquellos que sean nuevos a GLPK y que quieran usarla desde JAVA ya sea para un proyecto académico (como es mi caso) o de cualquier otra índole.
Slides for my talk in FrontFest 2018 (Madrid, Feb 17). It's a technical comparison of the change detection mechanism as implemented in AngularJS, React, Angular2 and VueJS
See demos at https://github.com/jabadia/frontfest-frameworks-demos
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018 Codemotion
GraalVM es una nueva tecnología creada por Oracle para la JVM que permite convertirse además en una máquina virtual "universal", permitiendo ejecutar código de JS, Python, Ruby, C, C++ o R. Jerónimo nos hará una introducción a GraalVM: - como reemplazo del JIT de Java - para generar ejecutables ultrarápidos de Java sin necesitar la JRE - para ejecutar otros lenguajes contándonos sus bondades y sus actuales limitaciones.
Find out more presentations at https://madrid2018.codemotionworld.com/speakers/
Taller realizado durante las 13as Jornadas Internacionales gvSIG en Valencia y las 4as Jornadas gvSIG de México. Explica las funcionalidades básicas del módulo de programación y un ejemplo de manejo de datos e inserción de un geoproceso en la Toolbox.
This is the presentation we gave at Spring 2GX Madrid. It shows how Grails helped us to improve our productivity and why Grails is not that bounded to Groovy and how it can be an outstanding alternative if you are a 100% Java company.
Greach 2013 - Todo lo que me hubiera gustado saber cuando empecé a desarrolla...Iván López Martín
Slides de mi charla de Greach 2013: "Todo lo que me hubiera gustado saber cuando empecé a desarrollar con Grails"
Video de la charla: http://greach.es/sessions-2013/ivan-lopez-martin-todo-lo-que-me-hubiera-gustado-saber-cuando-empece-a-desarrollar-con-grails
Codemotion 2013 - Quiero tiempo real y lo quiero para ayerIván López Martín
Slides de mi charla de Codemotion "http://codemotion.es/talk/19-october/88". El código fuente de las demos está disponible es https://github.com/lmivan/codemotion-2013.
El vídeo de repetción de la charla en @madridgug está disponible en: http://www.youtube.com/watch?v=dkDub1QLqmM
En un mundo hiper-conectado el concepto Tiempo Real es cada vez más utilizado y las arquitecturas "message driven" son la manera de conseguirlo porque permiten crear aplicaciones modulares y escalables.
En esta charla veremos un tipo de arquitectura totalmente distinta a la estandar de Grails para aplicaciones web que nos permitirá servir contenido en tiempo real a muchos clientes de manera rápida y sencilla teniendo distintos módulos independientes que interactuarán entre sí.
Deployer PHP. Presentación para #PHPSevillaAgencia INNN
Presentación que nuestro compañero Álex Martín (@Alexdw) realizó para evento de la comunidad PHP Sevilla titulado ‘Gulp & Deployer working with Symfony’.
Este evento se celebró el pasado 28 de septiembre de 2016 en las oficinas de Innn. #SomosINNN #PHPSevilla
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia
Airflow by Airbnb: Describir, temporizar y monitorizar flujos de trabajo basados en Python.
Introducción a los conceptos generales de Airflow con el fin de conocer el potencial y las capacidades que ofrece este nuevo “smart cron" basado en Python. Overview y primeros pasos para la utilización de la plataforma
Gulp js php sevilla 28 septiembre 2016Agencia INNN
Presentación que nuestro compañero Juan Luis García (@JuanluGarcíaB) realizó para evento de la comunidad PHP Sevilla titulado ‘Gulp & Deployer working with Symfony’.
Este evento se celebró el pasado 28 de septiembre de 2016 en las oficinas de Innn. #SomosINNN #PHPSevilla
Con esta guía rápida pretendo ahorrar algo de tiempo a aquellos que sean nuevos a GLPK y que quieran usarla desde JAVA ya sea para un proyecto académico (como es mi caso) o de cualquier otra índole.
Presentación sobre Reactive Programming en la JVM para el meetup JVM_MX.
Se mostraron conceptos sobre Reactive Programming y Functional Reactive Programming con la biblioteca RxJava de Netflix.
Programación Funcional y Orientada a Objetos con AsincronismosVíctor Bolinches
Jornadas de capatación de pequeños talentos Capgemini - UPV
18/05/2017
Ponencia Universidad Politécnica de Valencia - https://www.upv.es/
ETSINF - Escuela Técnica Superior de Ingeniería Informática
Java8 : Más allá de las Expresiones LambdasEudris Cabrera
Mi presentación en el #BarCampRD2015. En esta charla abordamos las bondades de #Java8 haciendo hincapié en las
expresiones lambdas y las características de la programación funcional.
Introducción al framework Angular 2 para el desarrollo de aplicaciones Web. Revisión a sus conceptos principales y su alineación con el estándar Web Components.
Charla impartida el 26 de enero de 2017 para SevillaJS.
En esta sesión os contaremos la visión de React para el desarrollo de aplicaciones web desde el punto de vista de un desarrollador de ASP.NET que tiene que aprender a trabajar con estas nuevas tecnologías.
Cross development - React para desarrolladores de asp.netAlberto Diaz Martin
En esta sesión os contaremos la visión de React para el desarrollo de aplicaciones web desde el punto de vista de un desarrollador de ASP.NET que tiene que aprender a trabajar con estas nuevas tecnologías.
Curso de test driven development usando AngularJS, Jasmine, Karma, Protractor, y Gulp para automatizar todo.
Codigo del proyecto de ejemplo:
https://github.com/rodrigopivi/angularComponentStarter
Escaneo y eliminación de malware en el equiponicromante2000
El malware tiene muchas caras, y es que los programas maliciosos se reproducen en los ordenadores de diferentes formas. Ya se trate de virus, de programas espía o de troyanos, la presencia de software malicioso en los sistemas informáticos siempre debería evitarse. Aquí te muestro como trabaja un anti malware a la hora de analizar tu equipo
Si bien los hospitales conjuntan a profesionales de salud que atienden a la población, existe un equipo de organización, coordinación y administración que permite que los cuidados clínicos se otorguen de manera constante y sin obstáculos.
Mario García Baltazar, director del área de Tecnología (TI) del Hospital Victoria La Salle, relató la manera en la que el departamento que él lidera, apoyado en Cirrus y Estela, brinda servicio a los clientes internos de la institución e impulsa una experiencia positiva en el paciente.
Conoce el Hospital Victoria La Salle
Ubicado en Ciudad Victoria, Tamaulipas, México
Inició operaciones en el 2016
Forma parte del Consorcio Mexicanos de Hospitales
Hospital de segundo nivel
21 habitaciones para estancia
31 camas censables
13 camillas
2 quirófanos
+174 integrantes en su plantilla
+120 equipos médicos de alta tecnología
+900 pacientes atendidos
Servicios de +20 especialidades
Módulos utilizados de Cirrus
HIS
EHR
ERP
Estela - Business Intelligence
Los desafíos de calidad de software que nos trae la IA y los LLMsFederico Toledo
En esta charla, nos sumergiremos en los desafíos emergentes que la inteligencia artificial (IA) y los Large Language Models (LLMs) traen al mundo de la calidad del software y el testing. Exploraremos cómo la integración, uso o diseño de modelos de IA plantean nuevos retos, incluyendo la calidad de datos y detección de sesgos, sumando la complejidad de probar algo no determinístico. Revisaremos algunas propuestas que se están llevando adelante para ajustar nuestras tareas de testing al desarrollo de este tipo de sistemas, incluyendo enfoques de pruebas automatizadas y observabilidad.
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.
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).
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