75-62 Técnicas de Programación Concurrentes II Lic. Ing. Osvaldo Clúa 2014 Facultad de Ingeniería Universidad de Buenos Aires Concurrencia Concurrencia en en Java Java 88 Paralell Streams Stream<E> parallelStream() Particiona el streams en varios substreams y los procesa en filtro2 = (Integer x) -> { paralelo Predicate<Integer> System.out.print("Investigando " + x); System.out.println(" ejecutandose en paralelo " + Thread.currentThread().getId()); return x > 5; }; List<Integer> l1 = Arrays.asList(12, 3, 4, 5, 23, 1, 67); OptionalDouble res2 = l1.parallelStream(). filter(filtro2).mapToInt(x -> x).average(); Investigando 23 ejecutandose en paralelo 1 Investigando 5 ejecutandose en paralelo 1 Investigando 12 ejecutandose en paralelo 12 Investigando 4Investigando 1 ejecutandose en paralelo 13 Investigando 3 ejecutandose en paralelo 1 Investigando 67 ejecutandose en paralelo 10 ejecutandose en paralelo 11 FIUBA 2014 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 2 Interface CompletionStage<T> ● Una etapa de procesamiento(podiblemente asincrónica) que se activa al finalizar otra etapa previa. FIUBA 2014 – El proceso puede ser una Function, Consumer o Runnable – Los métodos llevan sufijos apply, accept o run – Además hay opción de compose 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 3 ¿Cuando se ejecuta una etapa? ● Al finalizar la etapa anterior then ● Al finalizar una de dos etapas either ● Al finalizar dos etapas both FIUBA 2014 – thenApply – runAfterEither – thenAccpetBoth 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 4 Async ● Async indica asincronismo (ejecución paralela) Supplier trae = …. CompletableFuture.supplyAsync(trae) .thenAcceptAsync(new Impri()); public static class Impri implements Consumer<String>{ @Override public void accept(String t) { System.out.println("Terminada la task " + Thread.currentThread().getName()+ " con el valor <<" + t+">>"); } } FIUBA 2014 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 5 Proyecto ● ● Tanto con ParallelStream como con CompletableFuture se pueden construir cadenas de ejecución (pipes) Haga Ud un programa donde se vea si esas cadenas se hacen en threads separados o si hay un join al terminar cada etapa. FIUBA 2014 75-08 Sistemas Operativos Prof. Lic. Ing. Osvaldo Clúa 6