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

PPT
Unit Testing - Trovit
PPT
Unit Testing - GTUG
PPTX
Monitorizando aplicaciones con AspectJ
PDF
The Gift of Git [Español: La Palabra de Git]
PDF
Mobile Day - Kotlin
PDF
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PPT
Redes
PDF
Desarrollo con Java y metodologías agiles
Unit Testing - Trovit
Unit Testing - GTUG
Monitorizando aplicaciones con AspectJ
The Gift of Git [Español: La Palabra de Git]
Mobile Day - Kotlin
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
Redes
Desarrollo con Java y metodologías agiles

La actualidad más candente (20)

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

Similar a Concurrencia en Java (20)

PDF
Intro a cakephp
PDF
Intro a cakephp
PPTX
Java 8 time to join the future
PPTX
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
PDF
Introducción a NodeJS
ODP
Ajax: introducción
PPTX
Desarrollo Back-end Con React y node.pptx
PDF
Creación de aplicaciones web con Node.js y Express
PDF
JVM Reactive Programming
PPT
Java Script Frame Works
PDF
Programación Funcional y Orientada a Objetos con Asincronismos
PDF
Java8 : Más allá de las Expresiones Lambdas
PDF
Introducción a Angular
PPTX
JavaScript Avanzado con Node.js para Desarrollo Web
PPTX
Cross development - React para desarrolladores de asp.net
PPTX
CrossDvlpu - REACT para desarrolladores de ASP.NET
PPTX
19 javascript servidor
PPTX
Dragome en JavaConf Buenos Aires 2014
PDF
Probando aplicaciones AngularJS
PDF
PHP Unit y TDD
Intro a cakephp
Intro a cakephp
Java 8 time to join the future
ReConnect 2015 - ASP.NET 5: MVC 6 y EF 7
Introducción a NodeJS
Ajax: introducción
Desarrollo Back-end Con React y node.pptx
Creación de aplicaciones web con Node.js y Express
JVM Reactive Programming
Java Script Frame Works
Programación Funcional y Orientada a Objetos con Asincronismos
Java8 : Más allá de las Expresiones Lambdas
Introducción a Angular
JavaScript Avanzado con Node.js para Desarrollo Web
Cross development - React para desarrolladores de asp.net
CrossDvlpu - REACT para desarrolladores de ASP.NET
19 javascript servidor
Dragome en JavaConf Buenos Aires 2014
Probando aplicaciones AngularJS
PHP Unit y TDD
Publicidad

Último (8)

PDF
AutoCAD Herramientas para el futuro, Juan Fandiño
PDF
simulacion de teoria de control para maquinas
PDF
Su punto de partida en la IA: Microsoft 365 Copilot Chat
PDF
DIMENSIONADO DE UNA INSTALACION FOTOVOLTAICA.pdf
PPTX
Derechos_de_Autor_y_Creative_Commons.pptx
DOCX
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
PDF
modelos de control para sistemas digitales
PPTX
sistemas de informacion.................
AutoCAD Herramientas para el futuro, Juan Fandiño
simulacion de teoria de control para maquinas
Su punto de partida en la IA: Microsoft 365 Copilot Chat
DIMENSIONADO DE UNA INSTALACION FOTOVOLTAICA.pdf
Derechos_de_Autor_y_Creative_Commons.pptx
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
modelos de control para sistemas digitales
sistemas de informacion.................

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

  • #22: http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/
  • #23: 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