SlideShare une entreprise Scribd logo
1  sur  98
Télécharger pour lire hors ligne
@JosePaumard
asynchrones
Java
#J8Async @JosePaumard
Asynchrone ?
#J8Async @JosePaumard
AsynchroneAsynchrone
• Trois tâches à exécuter
T1
T2
T3
#J8Async @JosePaumard
AsynchroneAsynchrone
• 1ère façon de faire :
« exécution synchrone »
#J8Async @JosePaumard
AsynchroneAsynchrone
• 2ème façon de faire :
« exécution multithread »
#J8Async @JosePaumard
AsynchroneAsynchrone
• 2ème façon de faire :
« exécution multithread » … sur un seul cœur
#J8Async @JosePaumard
AsynchroneAsynchrone
• 3ème façon de faire :
« asynchrone »
#J8Async @JosePaumard
AsynchroneAsynchrone
• 3ème façon de faire :
« asynchrone » … même sur un multicœur
#J8Async @JosePaumard
AsynchroneAsynchrone
• 3ème façon de faire :
• Plus rapide ?
#J8Async @JosePaumard
• 3ème façon de faire :
• Plus rapide ?
 En général oui
 Approche « non blocking »
AsynchroneAsynchrone
#J8Async @JosePaumard
• Différence avec le modèle synchrone multithread ?
1) Le traitement décide de passer d’une tâche à l’autre
2) Pas de problème d’atomicité / visibilité
• Performances ?
 Pas de « context switch »
AsynchroneAsynchrone
#J8Async @JosePaumard
• Pattern
AsynchroneAsynchrone
queryEngine.select("select user from User")
.forEach(user ‐> System.out.prinln(user)) ;
#J8Async @JosePaumard
• Pattern
• Callback ou tâche : lambda expression
AsynchroneAsynchrone
queryEngine.select("select user from User")
.forEach(user ‐> System.out.prinln(user)) ;
#J8Async @JosePaumard
• Pattern
• Callback ou tâche : lambda expression
• Enchaînement : lorsque le résultat est disponible
alors on enchaîne avec le traitement
AsynchroneAsynchrone
queryEngine.select("select user from User")
.forEach(System.out::prinln) ;
#J8Async @JosePaumard
• Pattern
• Callback ou tâche : lambda expression
• Enchaînement : lorsque le résultat est disponible
alors on enchaîne avec le traitement
• Comment écrire ceci en Java ?
AsynchroneAsynchrone
queryEngine.select("select user from User")
.forEach(System.out::prinln) ;
#J8Async @JosePaumard
Notion de tâcheNotion de tâche
• Depuis Java 1 : Runnable
• Java 5 : Callable
• Java 5 : ExecutorService (pool de threads)
• On donne une tâche, on récupère un Future
#J8Async @JosePaumard
Notion de tâcheNotion de tâche
• Pattern
Callable<String> task = () ‐> "select user from User" ;
Future<String> future = executorService.submit(task) ;
#J8Async @JosePaumard
Notion de tâcheNotion de tâche
• Pattern
Callable<String> task = () ‐> "select user from User" ;
Future<String> future = executorService.submit(task) ;
List<User> users = future.get() ;    // blocking
users.forEach(System.out::println) ;
#J8Async @JosePaumard
Notion de tâcheNotion de tâche
• Pattern
• Le passage d’un objet d’une tâche à l’autre se fait
dans le thread « maître »
Callable<String> task = () ‐> "select user from User" ;
Future<String> future = executorService.submit(task) ;
List<User> users = future.get() ;    // blocking
users.forEach(System.out::println) ;
#J8Async @JosePaumard
Programmation asynchroneProgrammation asynchrone
• Nouveaux outils en Java 8 pour traiter ce point
• Solution pour enchaîner les tâches
• Asynchrone & multithread
#J8Async @JosePaumard
Questions ?
#J8Async
Questions ?
#J8Async
#J8Async @JosePaumard
• Nouvelle interface en Java 8 : CompletionStage
De quoi s’agit-il ?De quoi s’agit-il ?
/**
* A stage of a possibly asynchronous computation, that performs an
* action or computes a value when another CompletionStage completes.
* A stage completes upon termination of its computation, but this may
* in turn trigger other dependent stages.
*/
#J8Async @JosePaumard
• Nouvelle interface en Java 8 : CompletionStage
• CompletionStage = une tâche qui se déclenche sur
une autre et qui peut en déclencher d’autres
De quoi s’agit-il ?De quoi s’agit-il ?
/**
* A stage of a possibly asynchronous computation, that performs an
* action or computes a value when another CompletionStage completes.
* A stage completes upon termination of its computation, but this may
* in turn trigger other dependent stages
*/
#J8Async @JosePaumard
• Classe d’implémentation : CompletableFuture
• Implémente à la fois :
 Future
 CompletionStage
De quoi s’agit-il ?De quoi s’agit-il ?
#J8Async @JosePaumard
• CompletableFuture : modélise une tâche
• Peut être dans trois états :
De quoi s’agit-il ?De quoi s’agit-il ?
#J8Async @JosePaumard
• CompletableFuture : modélise une tâche
• Peut être dans trois états :
 En train d’être calculée
De quoi s’agit-il ?De quoi s’agit-il ?
#J8Async @JosePaumard
• CompletableFuture : modélise une tâche
• Peut être dans trois états :
 En train d’être calculée
 Calculée, ayant produit un résultat
De quoi s’agit-il ?De quoi s’agit-il ?
#J8Async @JosePaumard
• CompletableFuture : modélise une tâche
• Peut être dans trois états :
 En train d’être calculée
 Calculée, ayant produit un résultat
 Calculée, ayant généré une exception
De quoi s’agit-il ?De quoi s’agit-il ?
#J8Async @JosePaumard
FutureFuture
• Cinq méthodes :
boolean cancel(boolean mayInterruptIfRunning) ;
#J8Async @JosePaumard
FutureFuture
• Cinq méthodes :
boolean cancel(boolean mayInterruptIfRunning) ;
boolean isCanceled() ;
boolean isDone() ;
#J8Async @JosePaumard
FutureFuture
• Cinq méthodes :
boolean cancel(boolean mayInterruptIfRunning) ;
boolean isCanceled() ;
boolean isDone() ;
V get() ; // blocking call 
V get(long timeout, TimeUnit timeUnit) ; // may throw a checked exception
throws InterruptedException, ExecutionException, TimeoutException ;
#J8Async @JosePaumard
CompletableFutureCompletableFuture
• Méthodes de type « future » :
V join() ; // may throw an unchecked exception
V getNow(V valueIfAbsent) ; // returns immediately
#J8Async @JosePaumard
CompletableFutureCompletableFuture
• Méthodes de type « future » :
V join() ; // may throw an unchecked exception
V getNow(V valueIfAbsent) ; // returns immediately
boolean complete(V value) ;  // sets the returned value is not returned
void obtrudeValue(V value) ; // resets the returned value 
#J8Async @JosePaumard
CompletableFutureCompletableFuture
• Méthodes de type « future » :
V join() ; // may throw an unchecked exception
V getNow(V valueIfAbsent) ; // returns immediately
boolean complete(V value) ;  // sets the returned value is not returned
void obtrudeValue(V value) ; // resets the returned value 
boolean completeExceptionnaly(Throwable t) ;  // sets an exception
void obtrudeException(Throwable t) ; // resets with an exception
#J8Async @JosePaumard
Création d’un CompletableFutureCréation d’un CompletableFuture
• CompletableFuture déjà terminé
public static <U> CompletableFuture<U> completedFuture(U value) ;
#J8Async @JosePaumard
Création d’un CompletableFutureCréation d’un CompletableFuture
• CompletableFuture déjà terminé
public static <U> CompletableFuture<U> completedFuture(U value) ;
public static <U> CompletableFuture<U> 
supplyAsync(Supplier<U> value, Executor executor) ;
public static <U> CompletableFuture<U> 
runAsync(Runnable runnable, Executor executor) ;
#J8Async @JosePaumard
CompletionStageCompletionStage
• Concept : un étape dans un traitement global
 Peut être déclenchée par une étape précédente
 Peut déclencher d’autres étapes
 Peut être exécutée dans un executor particulier
#J8Async @JosePaumard
CompletionStageCompletionStage
• Notion tâche :
 Function : prend un argument, retourne une valeur
 Consumer : prend un argument
 Runnable
= interfaces fonctionnelles, donc lambda
#J8Async @JosePaumard
CompletionStage – chaînageCompletionStage – chaînage
• Chaînage après, même thread
public <U> CompletionStage<U> 
thenApply(Function<? super T,? extends U> fn);
public CompletionStage<Void> 
thenAccept(Consumer<? super T> action);
public CompletionStage<Void> 
thenRun(Runnable action);
#J8Async @JosePaumard
CompletionStage – chaînageCompletionStage – chaînage
• Chaînage après, autre thread (common FJ pool)
public <U> CompletionStage<U> 
thenApplyAsync(Function<? super T,? extends U> fn);
public CompletionStage<Void> 
thenAcceptAsync(Consumer<? super T> action);
public CompletionStage<Void> 
thenRunAsync(Runnable action);
#J8Async @JosePaumard
CompletionStage – chaînageCompletionStage – chaînage
• Chaînage après, autre thread (executor)
public <U> CompletionStage<U> 
thenApplyAsync(Function<? super T,? extends U> fn, Executor executor);
public CompletionStage<Void> 
thenAcceptAsync(Consumer<? super T> action, Executor executor);
public CompletionStage<Void> 
thenRunAsync(Runnable action, Executor executor);
#J8Async @JosePaumard
CompletionStage – compositionCompletionStage – composition
• Composition
public <U> CompletionStage<U> 
thenCompose(Function<? super T, ? extends CompletionStage<U>> fn);
public CompletionStage<Void> 
thenComposeAsync(
Function<? super T, ? extends CompletionStage<U>> fn);
public CompletionStage<Void> 
thenComposeAsync(
Function<? super T, ? extends CompletionStage<U>> fn,
Executor executor);
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• Ces deux familles de fonction permettent d’enchaîner
une opération après l’autre
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• On peut aussi enchaîner une tâche à la suite de deux
autres tâches
public CompletionStage<V> thenCombine
(CompletionStage<U> other, 
BiFunction<T, U, V> function) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• On peut aussi enchaîner une tâche à la suite de deux
autres tâches
• Prend les résultats de this et other
 Et les combine dans function
public CompletionStage<V> thenCombine
(CompletionStage<U> other, 
BiFunction<T, U, V> function) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• On peut aussi enchaîner une tâche à la suite de deux
autres tâches
public CompletionStage<V> thenCombine
(CompletionStage<U> other, 
BiFunction<T, U, V> function) ;
public CompletionStage<V> thenCombineAsync
(CompletionStage<U> other, 
BiFunction<T, U, V> function) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• On peut aussi enchaîner une tâche à la suite de deux
autres tâches
public CompletionStage<V> thenCombine
(CompletionStage<U> other, 
BiFunction<T, U, V> function) ;
public CompletionStage<V> thenCombineAsync
(CompletionStage<U> other, 
BiFunction<T, U, V> function, Executor executor) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• Versions avec Consumer
public CompletionStage<Void> thenAcceptBoth
(CompletionStage<U> other, 
BiConsumer<T, U> action) ;
public CompletionStage<Void> thenAcceptBothAsync
(CompletionStage<U> other, 
BiConsumer<T, U> action) ;
public CompletionStage<Void> thenAcceptBothAsync
(CompletionStage<U> other, 
BiConsumer<T, U> action, Executor executor) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• Versions avec Runnable
public CompletionStage<Void> runAfterBoth
(CompletionStage<?> other, 
Runnable action) ;
public CompletionStage<Void> runAfterBothAsync
(CompletionStage<?> other, 
Runnable action) ;
public CompletionStage<Void> runAfterBothAsync
(CompletionStage<?> other, 
Runnable action, Executor executor) ;
#J8Async @JosePaumard
Chaînage & compositionChaînage & composition
• Ces tâches se déclenchent conditionnellement à this
et à la tâche passée en paramètre
• Lorsque ces tâches sont terminées
• On peut aussi déclencher lorsque la première se
termine
#J8Async @JosePaumard
Chaînage multipleChaînage multiple
• Version function
public CompletionStage<V> applyToEither
(CompletionStage<? extends T> other, 
Function<T, U> function) ;
#J8Async @JosePaumard
Chaînage multipleChaînage multiple
• Version function
public CompletionStage<U> applyToEither
(CompletionStage<? extends T> other, 
Function<T, U> function) ;
public CompletionStage<U> applyToEitherAsync
(CompletionStage<? extends T> other, 
Function<T, U> function) ;
public CompletionStage<U> applyToEitherAsync
(CompletionStage<? extends T> other, 
Function<T, U> function, Executor executor) ;
#J8Async @JosePaumard
Chaînage multipleChaînage multiple
• Version consumer
public CompletionStage<V> acceptEither
(CompletionStage<? extends T> other, 
Consumer<? extends T> consumer) ;
public CompletionStage<V> acceptEitherAsync
(CompletionStage<? extends T> other, 
Consumer<? extends T> consumer) ;
public CompletionStage<V> acceptEitherAsync
(CompletionStage<? extends T> other, 
Consumer<? extends T> consumer, Executor executor) ;
#J8Async @JosePaumard
Chaînage multipleChaînage multiple
• Version runnable
public CompletionStage<V> runAfterEither
(CompletionStage<U> other, 
Runnable action) ;
public CompletionStage<V> runAfterEitherAsync
(CompletionStage<U> other, 
Runnable action) ;
public CompletionStage<V> runAfterEitherAsync
(CompletionStage<U> other, 
Runnable action, Executor executor) ;
#J8Async @JosePaumard
Création sur plusieurs tâchesCréation sur plusieurs tâches
• Méthodes statiques
public static CompletableFuture<Void> 
allOf(CompletableFuture<?>... cfs) ;
public static CompletableFuture<Object> 
anyOf(CompletableFuture<?>... cfs) ;
#J8Async @JosePaumard
Création sur plusieurs tâchesCréation sur plusieurs tâches
• Attention à la sémantique !
• Imprime « null »
public static CompletableFuture<Void> 
allOf(CompletableFuture<?>... cfs) ;
CompletableFuture<Void> allOf = CompletableFuture.allOf() ;
System.out.println("allOF : " + allOf.join()) ;
#J8Async @JosePaumard
Création sur plusieurs tâchesCréation sur plusieurs tâches
• Attention à la sémantique !
• Ne rend pas la main…
public static CompletableFuture<Void> 
allOf(CompletableFuture<?>... cfs) ;
CompletableFuture<Object> anyOf = CompletableFuture.anyOf() ;
System.out.println("anyOf : " + anyOf.join()) ;
#J8Async @JosePaumard
Création sur plusieurs tâchesCréation sur plusieurs tâches
• Attention à la sémantique !
public static CompletableFuture<Void> 
allOf(CompletableFuture<?>... cfs) ;
CompletableFuture<Object> anyOf = CompletableFuture.anyOf() ;
System.out.println("anyOf : " + anyOf.getNow("Nothing to say")) ;
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Point délicat :
 Une première étape consiste à créer les tâches et à
décrire leur enchaînement
 L’exécution des tâches démarre indépendamment des
appels
 À chaque étape, un CompletableFuture est créé
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Un CompletableFuture peut dépendre :
 Cas 1 : d’un autre CompletableFuture
 Cas 2 : de deux autres CompletableFuture
 Cas 3 : de N CompletableFuture
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Une exception est jetée dans le cas 1
 Tous les CompletableFuture sont en erreur
• Ils se terminent « exceptionnellement »
 isExceptionnaly() retourne true
 L’appel à get() jette une ExecutionException
 get().getCause() retourne l’exception première
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Une exception est jetée dans le cas 2
 Tous les CompletableFuture en aval sont en erreur
• Ils se terminent « exceptionnellement »
• L’autre tâche peut se terminer normalement
 On peut l’interroger par get() pour avoir son résultat
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Une exception est jetée dans le cas 3
 Le CompletableFuture retourné est en erreur
• Il se termine « exceptionnellement »
• Les autres tâches peuvent se terminer normalement
 On peut l’interroger par get() pour avoir son résultat
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• On peut aussi traiter une exception normalement
 Dans ce cas, l’exception est passée à la fonction
 Utile pour les checked exception
CompletionStage<T> exceptionally(
Function<Throwable, ? extends T> function);
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Méthode whenComplete()
 Dans ce cas t ou e est nul dans l’appel de action
 Le CompletableFuture retourné peut ne pas être en
erreur
CompletionStage<T> whenComplete
(BiConsumer<T, Throwable> action) ;
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Méthode whenComplete()
CompletionStage<T> whenComplete
(BiConsumer<T, Throwable> action) ;
CompletionStage<T> whenCompleteAsync
(BiConsumer<T, Throwable> action) ;
CompletionStage<T> whenCompleteAsync
(BiConsumer<T, Throwable> action, Executor executor) ;
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Méthode handle()
 Dans ce cas t ou e est nul dans l’appel de function
 Retourne un CompletableFuture qui peut ne pas être
en erreur
CompletionStage<T> handle
(BiFunction<T, Throwable, U> function) ;
#J8Async @JosePaumard
Gestion des exceptionsGestion des exceptions
• Méthode handle()
CompletionStage<T> handle
(BiFunction<T, Throwable, U> function) ;
CompletionStage<T> handleAsync
(BiFunction<T, Throwable, U> function) ;
CompletionStage<T> handleAsync
(BiFunction<T, Throwable, U> function, Executor executor) ;
#J8Async @JosePaumard
Une dernière méthodeUne dernière méthode
• CompletableFuture : On peut obtenir une estimation
du nombre de tâches qui attendent l’exécution d’une
tâche donnée
int getNumberOfDependents() ;
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
.thenApply(page ‐> linkParser.getLinks(page))
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
.thenApply(page ‐> linkParser.getLinks(page))
.thenAccept(
links ‐> displayPanel.display(links)
) ;
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
.thenApply(page ‐> linkParser.getLinks(page))
.thenAcceptAsync(
links ‐> displayPanel.display(links),
executor
) ;
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
public interface Executor {
void execute(Runnable command);
}
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
public interface Executor {
void execute(Runnable command);
}
Executor executor = runnable ‐> SwingUtilities.invokeLater(runnable) ;
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
.thenApply(page ‐> linkParser.getLinks(page))
.thenAcceptAsync(
links ‐> displayPanel.display(links), 
runnable ‐> SwingUtilities.invokeLater(runnable)
) ;
#J8Async @JosePaumard
Exemple – 1Exemple – 1
• Lecture asynchrone de liens et affichage
CompletableFuture.supplyAsync(
() ‐> readPage("http://whatever.com/")
)
.thenApply(Parser::getLinks)
.thenAcceptAsync(
DisplayPanel::display, 
SwingUtilities::invokeLater
) ;
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
@Inject
Event<String> event ;
event.fire("some event") ; // returns void
public void observes(@Observes String payload) {
// handle the event, called in the firing thread
}
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
public void observes(@Observes String payload) {
// handle the event, called in the firing thread
CompletableFuture.anyOf(/* some task */) ;
}
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
@Inject
Event<String> event ;
event.fireAsync("some event") ; // returns CompletableFuture<Object> (?)
public void observes(@Observes String payload) {
// handle the event in another thread
}
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
@Inject
Event<String> event ;
event.fireAsync("some event", executor) ; 
public void observes(@Observes String payload) {
// handle the event in the executor
}
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
@Inject
Event<String> event ;
event.fireAsync("some event", executor) ; 
@Produces @SwingExecutor
Executor executor = SwingUtilities::invokeLater
public void observes(@Observes String payload, 
@SwingExecutor Executor executor) {
// handle the event in the Swing thread
}
#J8Async @JosePaumard
Exemple – 2Exemple – 2
• Événements asynchrones dans CDI
@Inject
Event<String> event ;
event.fireAsync("some event", executor) ; 
@Produces @SwingExecutor
Executor executor = SwingUtilities::invokeLater
public void observes(@Observes @SwingExecutor String payload) {
// handle the event in the Swing thread
}
#J8Async @JosePaumard
Exemple – 3Exemple – 3
CompletableFuture<String> closing = new CompletableFuture<String>() ;
Stream<String> manyStrings = Stream.of("one", "two", "three") ;
CompletableFuture<String> reduce =
manyStrings
.onClose(() ‐> { closing.complete("Closed") ; })
.map(CompletableFuture::completedFuture)
.reduce(
closing,  
(cf1, cf2) ‐> cf1.thenCombine(cf2, function) // concatenation
) ;
manyStrings.close() ;
#J8Async @JosePaumard
L’indispensable !L’indispensable !
• Fixer la taille du Common Fork / Join Pool
System.setProperty(
"java.util.concurrent.ForkJoinPool.common.parallelism", 2) ;
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
• Très riche et souple à l’utilisation
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
• Très riche et souple à l’utilisation
• Construite sur l’utilisation des lambda
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
• Très riche et souple à l’utilisation
• Construite sur l’utilisation des lambda
• Permet un contrôle fin des threads
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
• Très riche et souple à l’utilisation
• Construite sur l’utilisation des lambda
• Permet un contrôle fin des threads
• Gère différents types de chaînage
#J8Async @JosePaumard
ConclusionConclusion
• On a une API pour le calcul asynchrone dans le JDK !
• Très riche et souple à l’utilisation
• Construite sur l’utilisation des lambda
• Permet un contrôle fin des threads
• Gère différents types de chaînage
• Gère intelligemment les exceptions
@JosePaumard#J8Stream
@JosePaumard#J8Stream

Contenu connexe

Tendances

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataLhouceine OUHAMZA
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses étatsJosé Paumard
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8Antoine Rey
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New FeaturesAli BAKAN
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Presentation of framework Angular
Presentation of framework AngularPresentation of framework Angular
Presentation of framework AngularLhouceine OUHAMZA
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 

Tendances (20)

Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
Spring Boot RestApi.pptx
Spring Boot RestApi.pptxSpring Boot RestApi.pptx
Spring Boot RestApi.pptx
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Jenkins
JenkinsJenkins
Jenkins
 
Les Streams de Java 8
Les Streams de Java 8Les Streams de Java 8
Les Streams de Java 8
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New Features
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Presentation of framework Angular
Presentation of framework AngularPresentation of framework Angular
Presentation of framework Angular
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 

En vedette

Les Streams sont parmi nous
Les Streams sont parmi nousLes Streams sont parmi nous
Les Streams sont parmi nousJosé Paumard
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample applicationAntoine Rey
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014José Paumard
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8José Paumard
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJosé Paumard
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8José Paumard
 

En vedette (7)

Les Streams sont parmi nous
Les Streams sont parmi nousLes Streams sont parmi nous
Les Streams sont parmi nous
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Spring Framework Petclinic sample application
Spring Framework Petclinic sample applicationSpring Framework Petclinic sample application
Spring Framework Petclinic sample application
 
Autumn collection JavaOne 2014
Autumn collection JavaOne 2014Autumn collection JavaOne 2014
Autumn collection JavaOne 2014
 
50 new things you can do with java 8
50 new things you can do with java 850 new things you can do with java 8
50 new things you can do with java 8
 
Java 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelizationJava 8, Streams & Collectors, patterns, performances and parallelization
Java 8, Streams & Collectors, patterns, performances and parallelization
 
50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
 

Similaire à API Asynchrones en Java 8

16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdfPatiento Del Mar
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Publicis Sapient Engineering
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Future of java script web version
Future of java script web versionFuture of java script web version
Future of java script web versionSébastien Pertus
 
Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012slandelle
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Ruau Mickael
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzlesMicrosoft
 
Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Vincent Tencé
 
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAutomatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAgile Montréal
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring BatchOlivier BAZOUD
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronestchappui
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptMicrosoft
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011Normandy JUG
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et TriggersAffinitic
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech daysJean-Pierre Vincent
 

Similaire à API Asynchrones en Java 8 (20)

Living Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptxLiving Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptx
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Future of java script web version
Future of java script web versionFuture of java script web version
Future of java script web version
 
Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012Gatling Tool in Action at DevoxxFR 2012
Gatling Tool in Action at DevoxxFR 2012
 
Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?Javascript - Fonctions : que fait ce code ?
Javascript - Fonctions : que fait ce code ?
 
C# et .NET : Enigmes et puzzles
C# et .NET : Enigmes  et puzzlesC# et .NET : Enigmes  et puzzles
C# et .NET : Enigmes et puzzles
 
Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?Automatiser les tests d'acceptation : comment s'y prendre ?
Automatiser les tests d'acceptation : comment s'y prendre ?
 
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent TencéAutomatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
Automatiser les tests d’acceptation : comment s’y prendre ? - Vincent Tencé
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Spring Batch ParisJUG
Spring Batch ParisJUG Spring Batch ParisJUG
Spring Batch ParisJUG
 
Paris JUG Spring Batch
Paris JUG Spring BatchParis JUG Spring Batch
Paris JUG Spring Batch
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011
 
Promises Javascript
Promises JavascriptPromises Javascript
Promises Javascript
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Plpython et Triggers
Plpython et TriggersPlpython et Triggers
Plpython et Triggers
 
Fondamentaux portée - contexte - function ms tech days
Fondamentaux   portée - contexte - function ms tech daysFondamentaux   portée - contexte - function ms tech days
Fondamentaux portée - contexte - function ms tech days
 

Plus de José Paumard

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19José Paumard
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfJosé Paumard
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingJosé Paumard
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKJosé Paumard
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of FlatteryJosé Paumard
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternJosé Paumard
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapesJosé Paumard
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!José Paumard
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2José Paumard
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1José Paumard
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowJosé Paumard
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJosé Paumard
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the WildJosé Paumard
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJosé Paumard
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full storyJosé Paumard
 

Plus de José Paumard (20)

Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
From Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdfFrom Java 11 to 17 and beyond.pdf
From Java 11 to 17 and beyond.pdf
 
The Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern MatchingThe Future of Java: Records, Sealed Classes and Pattern Matching
The Future of Java: Records, Sealed Classes and Pattern Matching
 
Deep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UKDeep Dive Java 17 Devoxx UK
Deep Dive Java 17 Devoxx UK
 
Designing functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patternsDesigning functional and fluent API: application to some GoF patterns
Designing functional and fluent API: application to some GoF patterns
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
The Sincerest Form of Flattery
The Sincerest Form of FlatteryThe Sincerest Form of Flattery
The Sincerest Form of Flattery
 
Designing functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor PatternDesigning functional and fluent API: example of the Visitor Pattern
Designing functional and fluent API: example of the Visitor Pattern
 
Construire son JDK en 10 étapes
Construire son JDK en 10 étapesConstruire son JDK en 10 étapes
Construire son JDK en 10 étapes
 
Java Keeps Throttling Up!
Java Keeps Throttling Up!Java Keeps Throttling Up!
Java Keeps Throttling Up!
 
Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2Lambdas and Streams Master Class Part 2
Lambdas and Streams Master Class Part 2
 
Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1Lambda and Stream Master class - part 1
Lambda and Stream Master class - part 1
 
Asynchronous Systems with Fn Flow
Asynchronous Systems with Fn FlowAsynchronous Systems with Fn Flow
Asynchronous Systems with Fn Flow
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
Collectors in the Wild
Collectors in the WildCollectors in the Wild
Collectors in the Wild
 
Streams in the wild
Streams in the wildStreams in the wild
Streams in the wild
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
Free your lambdas
Free your lambdasFree your lambdas
Free your lambdas
 
Linked to ArrayList: the full story
Linked to ArrayList: the full storyLinked to ArrayList: the full story
Linked to ArrayList: the full story
 

Dernier

Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Alain Marois
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfRiDaHAziz
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 37
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationpapediallo3
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSKennel
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 37
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...Faga1939
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre françaisTxaruka
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSKennel
 
Pharmacologie des cardiotoniques pour Pharmacie
Pharmacologie des cardiotoniques pour PharmaciePharmacologie des cardiotoniques pour Pharmacie
Pharmacologie des cardiotoniques pour PharmacieLoloshka
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfRiDaHAziz
 
Pas de vagues. pptx Film français
Pas de vagues.  pptx      Film   françaisPas de vagues.  pptx      Film   français
Pas de vagues. pptx Film françaisTxaruka
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSKennel
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSKennel
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeXL Groupe
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Gilles Le Page
 

Dernier (18)

Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024Zotero avancé - support de formation doctorants SHS 2024
Zotero avancé - support de formation doctorants SHS 2024
 
PIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdfPIE-A2-P4-support stagiaires sept 22-validé.pdf
PIE-A2-P4-support stagiaires sept 22-validé.pdf
 
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdfBibdoc 2024 - Ecologie du livre et creation de badge.pdf
Bibdoc 2024 - Ecologie du livre et creation de badge.pdf
 
Cours de Management des Systèmes d'information
Cours de Management des Systèmes d'informationCours de Management des Systèmes d'information
Cours de Management des Systèmes d'information
 
DO PALÁCIO À ASSEMBLEIA .
DO PALÁCIO À ASSEMBLEIA                 .DO PALÁCIO À ASSEMBLEIA                 .
DO PALÁCIO À ASSEMBLEIA .
 
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_FormationRecherche.pdf
 
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdfBibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
Bibdoc 2024 - Les maillons de la chaine du livre face aux enjeux écologiques.pdf
 
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
LA MONTÉE DE L'ÉDUCATION DANS LE MONDE DE LA PRÉHISTOIRE À L'ÈRE CONTEMPORAIN...
 
Bernard Réquichot.pptx Peintre français
Bernard Réquichot.pptx   Peintre françaisBernard Réquichot.pptx   Peintre français
Bernard Réquichot.pptx Peintre français
 
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_IA.pdf
 
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdfSciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
SciencesPo_Aix_InnovationPédagogique_Atelier_EtudiantActeur.pdf
 
Pharmacologie des cardiotoniques pour Pharmacie
Pharmacologie des cardiotoniques pour PharmaciePharmacologie des cardiotoniques pour Pharmacie
Pharmacologie des cardiotoniques pour Pharmacie
 
PIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdfPIE-A2-P 5- Supports stagiaires.pptx.pdf
PIE-A2-P 5- Supports stagiaires.pptx.pdf
 
Pas de vagues. pptx Film français
Pas de vagues.  pptx      Film   françaisPas de vagues.  pptx      Film   français
Pas de vagues. pptx Film français
 
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdfSciencesPo_Aix_InnovationPédagogique_Bilan.pdf
SciencesPo_Aix_InnovationPédagogique_Bilan.pdf
 
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdfSciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
SciencesPo_Aix_InnovationPédagogique_Conférence_SK.pdf
 
Le Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directeLe Lean sur une ligne de production : Formation et mise en application directe
Le Lean sur une ligne de production : Formation et mise en application directe
 
Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024Presentation de la plateforme Moodle - avril 2024
Presentation de la plateforme Moodle - avril 2024
 

API Asynchrones en Java 8

  • 4. #J8Async @JosePaumard AsynchroneAsynchrone • 1ère façon de faire : « exécution synchrone »
  • 5. #J8Async @JosePaumard AsynchroneAsynchrone • 2ème façon de faire : « exécution multithread »
  • 6. #J8Async @JosePaumard AsynchroneAsynchrone • 2ème façon de faire : « exécution multithread » … sur un seul cœur
  • 7. #J8Async @JosePaumard AsynchroneAsynchrone • 3ème façon de faire : « asynchrone »
  • 8. #J8Async @JosePaumard AsynchroneAsynchrone • 3ème façon de faire : « asynchrone » … même sur un multicœur
  • 9. #J8Async @JosePaumard AsynchroneAsynchrone • 3ème façon de faire : • Plus rapide ?
  • 10. #J8Async @JosePaumard • 3ème façon de faire : • Plus rapide ?  En général oui  Approche « non blocking » AsynchroneAsynchrone
  • 11. #J8Async @JosePaumard • Différence avec le modèle synchrone multithread ? 1) Le traitement décide de passer d’une tâche à l’autre 2) Pas de problème d’atomicité / visibilité • Performances ?  Pas de « context switch » AsynchroneAsynchrone
  • 13. #J8Async @JosePaumard • Pattern • Callback ou tâche : lambda expression AsynchroneAsynchrone queryEngine.select("select user from User") .forEach(user ‐> System.out.prinln(user)) ;
  • 14. #J8Async @JosePaumard • Pattern • Callback ou tâche : lambda expression • Enchaînement : lorsque le résultat est disponible alors on enchaîne avec le traitement AsynchroneAsynchrone queryEngine.select("select user from User") .forEach(System.out::prinln) ;
  • 15. #J8Async @JosePaumard • Pattern • Callback ou tâche : lambda expression • Enchaînement : lorsque le résultat est disponible alors on enchaîne avec le traitement • Comment écrire ceci en Java ? AsynchroneAsynchrone queryEngine.select("select user from User") .forEach(System.out::prinln) ;
  • 16. #J8Async @JosePaumard Notion de tâcheNotion de tâche • Depuis Java 1 : Runnable • Java 5 : Callable • Java 5 : ExecutorService (pool de threads) • On donne une tâche, on récupère un Future
  • 17. #J8Async @JosePaumard Notion de tâcheNotion de tâche • Pattern Callable<String> task = () ‐> "select user from User" ; Future<String> future = executorService.submit(task) ;
  • 18. #J8Async @JosePaumard Notion de tâcheNotion de tâche • Pattern Callable<String> task = () ‐> "select user from User" ; Future<String> future = executorService.submit(task) ; List<User> users = future.get() ;    // blocking users.forEach(System.out::println) ;
  • 19. #J8Async @JosePaumard Notion de tâcheNotion de tâche • Pattern • Le passage d’un objet d’une tâche à l’autre se fait dans le thread « maître » Callable<String> task = () ‐> "select user from User" ; Future<String> future = executorService.submit(task) ; List<User> users = future.get() ;    // blocking users.forEach(System.out::println) ;
  • 20. #J8Async @JosePaumard Programmation asynchroneProgrammation asynchrone • Nouveaux outils en Java 8 pour traiter ce point • Solution pour enchaîner les tâches • Asynchrone & multithread
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 27. #J8Async @JosePaumard • Nouvelle interface en Java 8 : CompletionStage De quoi s’agit-il ?De quoi s’agit-il ? /** * A stage of a possibly asynchronous computation, that performs an * action or computes a value when another CompletionStage completes. * A stage completes upon termination of its computation, but this may * in turn trigger other dependent stages. */
  • 28. #J8Async @JosePaumard • Nouvelle interface en Java 8 : CompletionStage • CompletionStage = une tâche qui se déclenche sur une autre et qui peut en déclencher d’autres De quoi s’agit-il ?De quoi s’agit-il ? /** * A stage of a possibly asynchronous computation, that performs an * action or computes a value when another CompletionStage completes. * A stage completes upon termination of its computation, but this may * in turn trigger other dependent stages */
  • 29. #J8Async @JosePaumard • Classe d’implémentation : CompletableFuture • Implémente à la fois :  Future  CompletionStage De quoi s’agit-il ?De quoi s’agit-il ?
  • 30. #J8Async @JosePaumard • CompletableFuture : modélise une tâche • Peut être dans trois états : De quoi s’agit-il ?De quoi s’agit-il ?
  • 31. #J8Async @JosePaumard • CompletableFuture : modélise une tâche • Peut être dans trois états :  En train d’être calculée De quoi s’agit-il ?De quoi s’agit-il ?
  • 32. #J8Async @JosePaumard • CompletableFuture : modélise une tâche • Peut être dans trois états :  En train d’être calculée  Calculée, ayant produit un résultat De quoi s’agit-il ?De quoi s’agit-il ?
  • 33. #J8Async @JosePaumard • CompletableFuture : modélise une tâche • Peut être dans trois états :  En train d’être calculée  Calculée, ayant produit un résultat  Calculée, ayant généré une exception De quoi s’agit-il ?De quoi s’agit-il ?
  • 34. #J8Async @JosePaumard FutureFuture • Cinq méthodes : boolean cancel(boolean mayInterruptIfRunning) ;
  • 35. #J8Async @JosePaumard FutureFuture • Cinq méthodes : boolean cancel(boolean mayInterruptIfRunning) ; boolean isCanceled() ; boolean isDone() ;
  • 36. #J8Async @JosePaumard FutureFuture • Cinq méthodes : boolean cancel(boolean mayInterruptIfRunning) ; boolean isCanceled() ; boolean isDone() ; V get() ; // blocking call  V get(long timeout, TimeUnit timeUnit) ; // may throw a checked exception throws InterruptedException, ExecutionException, TimeoutException ;
  • 37. #J8Async @JosePaumard CompletableFutureCompletableFuture • Méthodes de type « future » : V join() ; // may throw an unchecked exception V getNow(V valueIfAbsent) ; // returns immediately
  • 38. #J8Async @JosePaumard CompletableFutureCompletableFuture • Méthodes de type « future » : V join() ; // may throw an unchecked exception V getNow(V valueIfAbsent) ; // returns immediately boolean complete(V value) ;  // sets the returned value is not returned void obtrudeValue(V value) ; // resets the returned value 
  • 39. #J8Async @JosePaumard CompletableFutureCompletableFuture • Méthodes de type « future » : V join() ; // may throw an unchecked exception V getNow(V valueIfAbsent) ; // returns immediately boolean complete(V value) ;  // sets the returned value is not returned void obtrudeValue(V value) ; // resets the returned value  boolean completeExceptionnaly(Throwable t) ;  // sets an exception void obtrudeException(Throwable t) ; // resets with an exception
  • 40. #J8Async @JosePaumard Création d’un CompletableFutureCréation d’un CompletableFuture • CompletableFuture déjà terminé public static <U> CompletableFuture<U> completedFuture(U value) ;
  • 41. #J8Async @JosePaumard Création d’un CompletableFutureCréation d’un CompletableFuture • CompletableFuture déjà terminé public static <U> CompletableFuture<U> completedFuture(U value) ; public static <U> CompletableFuture<U>  supplyAsync(Supplier<U> value, Executor executor) ; public static <U> CompletableFuture<U>  runAsync(Runnable runnable, Executor executor) ;
  • 42. #J8Async @JosePaumard CompletionStageCompletionStage • Concept : un étape dans un traitement global  Peut être déclenchée par une étape précédente  Peut déclencher d’autres étapes  Peut être exécutée dans un executor particulier
  • 43. #J8Async @JosePaumard CompletionStageCompletionStage • Notion tâche :  Function : prend un argument, retourne une valeur  Consumer : prend un argument  Runnable = interfaces fonctionnelles, donc lambda
  • 44. #J8Async @JosePaumard CompletionStage – chaînageCompletionStage – chaînage • Chaînage après, même thread public <U> CompletionStage<U>  thenApply(Function<? super T,? extends U> fn); public CompletionStage<Void>  thenAccept(Consumer<? super T> action); public CompletionStage<Void>  thenRun(Runnable action);
  • 45. #J8Async @JosePaumard CompletionStage – chaînageCompletionStage – chaînage • Chaînage après, autre thread (common FJ pool) public <U> CompletionStage<U>  thenApplyAsync(Function<? super T,? extends U> fn); public CompletionStage<Void>  thenAcceptAsync(Consumer<? super T> action); public CompletionStage<Void>  thenRunAsync(Runnable action);
  • 46. #J8Async @JosePaumard CompletionStage – chaînageCompletionStage – chaînage • Chaînage après, autre thread (executor) public <U> CompletionStage<U>  thenApplyAsync(Function<? super T,? extends U> fn, Executor executor); public CompletionStage<Void>  thenAcceptAsync(Consumer<? super T> action, Executor executor); public CompletionStage<Void>  thenRunAsync(Runnable action, Executor executor);
  • 47. #J8Async @JosePaumard CompletionStage – compositionCompletionStage – composition • Composition public <U> CompletionStage<U>  thenCompose(Function<? super T, ? extends CompletionStage<U>> fn); public CompletionStage<Void>  thenComposeAsync( Function<? super T, ? extends CompletionStage<U>> fn); public CompletionStage<Void>  thenComposeAsync( Function<? super T, ? extends CompletionStage<U>> fn, Executor executor);
  • 48. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • Ces deux familles de fonction permettent d’enchaîner une opération après l’autre
  • 49. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • On peut aussi enchaîner une tâche à la suite de deux autres tâches public CompletionStage<V> thenCombine (CompletionStage<U> other,  BiFunction<T, U, V> function) ;
  • 50. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • On peut aussi enchaîner une tâche à la suite de deux autres tâches • Prend les résultats de this et other  Et les combine dans function public CompletionStage<V> thenCombine (CompletionStage<U> other,  BiFunction<T, U, V> function) ;
  • 51. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • On peut aussi enchaîner une tâche à la suite de deux autres tâches public CompletionStage<V> thenCombine (CompletionStage<U> other,  BiFunction<T, U, V> function) ; public CompletionStage<V> thenCombineAsync (CompletionStage<U> other,  BiFunction<T, U, V> function) ;
  • 52. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • On peut aussi enchaîner une tâche à la suite de deux autres tâches public CompletionStage<V> thenCombine (CompletionStage<U> other,  BiFunction<T, U, V> function) ; public CompletionStage<V> thenCombineAsync (CompletionStage<U> other,  BiFunction<T, U, V> function, Executor executor) ;
  • 53. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • Versions avec Consumer public CompletionStage<Void> thenAcceptBoth (CompletionStage<U> other,  BiConsumer<T, U> action) ; public CompletionStage<Void> thenAcceptBothAsync (CompletionStage<U> other,  BiConsumer<T, U> action) ; public CompletionStage<Void> thenAcceptBothAsync (CompletionStage<U> other,  BiConsumer<T, U> action, Executor executor) ;
  • 54. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • Versions avec Runnable public CompletionStage<Void> runAfterBoth (CompletionStage<?> other,  Runnable action) ; public CompletionStage<Void> runAfterBothAsync (CompletionStage<?> other,  Runnable action) ; public CompletionStage<Void> runAfterBothAsync (CompletionStage<?> other,  Runnable action, Executor executor) ;
  • 55. #J8Async @JosePaumard Chaînage & compositionChaînage & composition • Ces tâches se déclenchent conditionnellement à this et à la tâche passée en paramètre • Lorsque ces tâches sont terminées • On peut aussi déclencher lorsque la première se termine
  • 56. #J8Async @JosePaumard Chaînage multipleChaînage multiple • Version function public CompletionStage<V> applyToEither (CompletionStage<? extends T> other,  Function<T, U> function) ;
  • 57. #J8Async @JosePaumard Chaînage multipleChaînage multiple • Version function public CompletionStage<U> applyToEither (CompletionStage<? extends T> other,  Function<T, U> function) ; public CompletionStage<U> applyToEitherAsync (CompletionStage<? extends T> other,  Function<T, U> function) ; public CompletionStage<U> applyToEitherAsync (CompletionStage<? extends T> other,  Function<T, U> function, Executor executor) ;
  • 58. #J8Async @JosePaumard Chaînage multipleChaînage multiple • Version consumer public CompletionStage<V> acceptEither (CompletionStage<? extends T> other,  Consumer<? extends T> consumer) ; public CompletionStage<V> acceptEitherAsync (CompletionStage<? extends T> other,  Consumer<? extends T> consumer) ; public CompletionStage<V> acceptEitherAsync (CompletionStage<? extends T> other,  Consumer<? extends T> consumer, Executor executor) ;
  • 59. #J8Async @JosePaumard Chaînage multipleChaînage multiple • Version runnable public CompletionStage<V> runAfterEither (CompletionStage<U> other,  Runnable action) ; public CompletionStage<V> runAfterEitherAsync (CompletionStage<U> other,  Runnable action) ; public CompletionStage<V> runAfterEitherAsync (CompletionStage<U> other,  Runnable action, Executor executor) ;
  • 60. #J8Async @JosePaumard Création sur plusieurs tâchesCréation sur plusieurs tâches • Méthodes statiques public static CompletableFuture<Void>  allOf(CompletableFuture<?>... cfs) ; public static CompletableFuture<Object>  anyOf(CompletableFuture<?>... cfs) ;
  • 61. #J8Async @JosePaumard Création sur plusieurs tâchesCréation sur plusieurs tâches • Attention à la sémantique ! • Imprime « null » public static CompletableFuture<Void>  allOf(CompletableFuture<?>... cfs) ; CompletableFuture<Void> allOf = CompletableFuture.allOf() ; System.out.println("allOF : " + allOf.join()) ;
  • 62. #J8Async @JosePaumard Création sur plusieurs tâchesCréation sur plusieurs tâches • Attention à la sémantique ! • Ne rend pas la main… public static CompletableFuture<Void>  allOf(CompletableFuture<?>... cfs) ; CompletableFuture<Object> anyOf = CompletableFuture.anyOf() ; System.out.println("anyOf : " + anyOf.join()) ;
  • 63. #J8Async @JosePaumard Création sur plusieurs tâchesCréation sur plusieurs tâches • Attention à la sémantique ! public static CompletableFuture<Void>  allOf(CompletableFuture<?>... cfs) ; CompletableFuture<Object> anyOf = CompletableFuture.anyOf() ; System.out.println("anyOf : " + anyOf.getNow("Nothing to say")) ;
  • 64. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Point délicat :  Une première étape consiste à créer les tâches et à décrire leur enchaînement  L’exécution des tâches démarre indépendamment des appels  À chaque étape, un CompletableFuture est créé
  • 65. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Un CompletableFuture peut dépendre :  Cas 1 : d’un autre CompletableFuture  Cas 2 : de deux autres CompletableFuture  Cas 3 : de N CompletableFuture
  • 66. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Une exception est jetée dans le cas 1  Tous les CompletableFuture sont en erreur • Ils se terminent « exceptionnellement »  isExceptionnaly() retourne true  L’appel à get() jette une ExecutionException  get().getCause() retourne l’exception première
  • 67. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Une exception est jetée dans le cas 2  Tous les CompletableFuture en aval sont en erreur • Ils se terminent « exceptionnellement » • L’autre tâche peut se terminer normalement  On peut l’interroger par get() pour avoir son résultat
  • 68. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Une exception est jetée dans le cas 3  Le CompletableFuture retourné est en erreur • Il se termine « exceptionnellement » • Les autres tâches peuvent se terminer normalement  On peut l’interroger par get() pour avoir son résultat
  • 69. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • On peut aussi traiter une exception normalement  Dans ce cas, l’exception est passée à la fonction  Utile pour les checked exception CompletionStage<T> exceptionally( Function<Throwable, ? extends T> function);
  • 70. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Méthode whenComplete()  Dans ce cas t ou e est nul dans l’appel de action  Le CompletableFuture retourné peut ne pas être en erreur CompletionStage<T> whenComplete (BiConsumer<T, Throwable> action) ;
  • 71. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Méthode whenComplete() CompletionStage<T> whenComplete (BiConsumer<T, Throwable> action) ; CompletionStage<T> whenCompleteAsync (BiConsumer<T, Throwable> action) ; CompletionStage<T> whenCompleteAsync (BiConsumer<T, Throwable> action, Executor executor) ;
  • 72. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Méthode handle()  Dans ce cas t ou e est nul dans l’appel de function  Retourne un CompletableFuture qui peut ne pas être en erreur CompletionStage<T> handle (BiFunction<T, Throwable, U> function) ;
  • 73. #J8Async @JosePaumard Gestion des exceptionsGestion des exceptions • Méthode handle() CompletionStage<T> handle (BiFunction<T, Throwable, U> function) ; CompletionStage<T> handleAsync (BiFunction<T, Throwable, U> function) ; CompletionStage<T> handleAsync (BiFunction<T, Throwable, U> function, Executor executor) ;
  • 74. #J8Async @JosePaumard Une dernière méthodeUne dernière méthode • CompletableFuture : On peut obtenir une estimation du nombre de tâches qui attendent l’exécution d’une tâche donnée int getNumberOfDependents() ;
  • 75. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") )
  • 76. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") ) .thenApply(page ‐> linkParser.getLinks(page))
  • 77. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") ) .thenApply(page ‐> linkParser.getLinks(page)) .thenAccept( links ‐> displayPanel.display(links) ) ;
  • 78. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") ) .thenApply(page ‐> linkParser.getLinks(page)) .thenAcceptAsync( links ‐> displayPanel.display(links), executor ) ;
  • 79. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage public interface Executor { void execute(Runnable command); }
  • 80. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage public interface Executor { void execute(Runnable command); } Executor executor = runnable ‐> SwingUtilities.invokeLater(runnable) ;
  • 81. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") ) .thenApply(page ‐> linkParser.getLinks(page)) .thenAcceptAsync( links ‐> displayPanel.display(links),  runnable ‐> SwingUtilities.invokeLater(runnable) ) ;
  • 82. #J8Async @JosePaumard Exemple – 1Exemple – 1 • Lecture asynchrone de liens et affichage CompletableFuture.supplyAsync( () ‐> readPage("http://whatever.com/") ) .thenApply(Parser::getLinks) .thenAcceptAsync( DisplayPanel::display,  SwingUtilities::invokeLater ) ;
  • 83. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI @Inject Event<String> event ; event.fire("some event") ; // returns void public void observes(@Observes String payload) { // handle the event, called in the firing thread }
  • 84. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI public void observes(@Observes String payload) { // handle the event, called in the firing thread CompletableFuture.anyOf(/* some task */) ; }
  • 85. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI @Inject Event<String> event ; event.fireAsync("some event") ; // returns CompletableFuture<Object> (?) public void observes(@Observes String payload) { // handle the event in another thread }
  • 86. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI @Inject Event<String> event ; event.fireAsync("some event", executor) ;  public void observes(@Observes String payload) { // handle the event in the executor }
  • 87. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI @Inject Event<String> event ; event.fireAsync("some event", executor) ;  @Produces @SwingExecutor Executor executor = SwingUtilities::invokeLater public void observes(@Observes String payload,  @SwingExecutor Executor executor) { // handle the event in the Swing thread }
  • 88. #J8Async @JosePaumard Exemple – 2Exemple – 2 • Événements asynchrones dans CDI @Inject Event<String> event ; event.fireAsync("some event", executor) ;  @Produces @SwingExecutor Executor executor = SwingUtilities::invokeLater public void observes(@Observes @SwingExecutor String payload) { // handle the event in the Swing thread }
  • 89. #J8Async @JosePaumard Exemple – 3Exemple – 3 CompletableFuture<String> closing = new CompletableFuture<String>() ; Stream<String> manyStrings = Stream.of("one", "two", "three") ; CompletableFuture<String> reduce = manyStrings .onClose(() ‐> { closing.complete("Closed") ; }) .map(CompletableFuture::completedFuture) .reduce( closing,   (cf1, cf2) ‐> cf1.thenCombine(cf2, function) // concatenation ) ; manyStrings.close() ;
  • 90. #J8Async @JosePaumard L’indispensable !L’indispensable ! • Fixer la taille du Common Fork / Join Pool System.setProperty( "java.util.concurrent.ForkJoinPool.common.parallelism", 2) ;
  • 91. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK !
  • 92. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK ! • Très riche et souple à l’utilisation
  • 93. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK ! • Très riche et souple à l’utilisation • Construite sur l’utilisation des lambda
  • 94. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK ! • Très riche et souple à l’utilisation • Construite sur l’utilisation des lambda • Permet un contrôle fin des threads
  • 95. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK ! • Très riche et souple à l’utilisation • Construite sur l’utilisation des lambda • Permet un contrôle fin des threads • Gère différents types de chaînage
  • 96. #J8Async @JosePaumard ConclusionConclusion • On a une API pour le calcul asynchrone dans le JDK ! • Très riche et souple à l’utilisation • Construite sur l’utilisation des lambda • Permet un contrôle fin des threads • Gère différents types de chaînage • Gère intelligemment les exceptions