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

Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java Youness Boukouchi
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiENSET, Université Hassan II Casablanca
 
Ionic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,SassIonic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,Sassmarwa baich
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine Rey
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JSAbdoulaye Dieng
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptxYaminaGh1
 
Cours javascript
Cours javascriptCours javascript
Cours javascriptkrymo
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partiekadzaki
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...MICHRAFY MUSTAFA
 

Tendances (20)

Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Les collections en Java
Les collections en JavaLes collections en Java
Les collections en Java
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java JDBC: Gestion des bases de données en Java
JDBC: Gestion des bases de données en Java
 
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfiJava entreprise edition et industrialisation du génie logiciel par m.youssfi
Java entreprise edition et industrialisation du génie logiciel par m.youssfi
 
Ionic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,SassIonic, AngularJS,Cordova,NodeJS,Sass
Ionic, AngularJS,Cordova,NodeJS,Sass
 
Support de cours angular
Support de cours angularSupport de cours angular
Support de cours angular
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
cours javascript.pptx
cours javascript.pptxcours javascript.pptx
cours javascript.pptx
 
Cours javascript
Cours javascriptCours javascript
Cours javascript
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partie
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
 

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
 
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
 

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
 
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
 

Dernier

Chapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon CoursChapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon Coursebenezerngoran
 
Cours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdfCours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdfssuserc72852
 
Apolonia, Apolonia.pptx Film documentaire
Apolonia, Apolonia.pptx         Film documentaireApolonia, Apolonia.pptx         Film documentaire
Apolonia, Apolonia.pptx Film documentaireTxaruka
 
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...Faga1939
 
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projetFormation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projetJeanYvesMoine
 
Les roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptxLes roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptxShinyaHilalYamanaka
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...Nguyen Thanh Tu Collection
 
Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfAmgdoulHatim
 
Cours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdfCours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdfachrafbrahimi1
 
Formation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptxFormation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptxrajaakiass01
 
La nouvelle femme . pptx Film français
La   nouvelle   femme  . pptx  Film françaisLa   nouvelle   femme  . pptx  Film français
La nouvelle femme . pptx Film françaisTxaruka
 
Sidonie au Japon . pptx Un film français
Sidonie    au   Japon  .  pptx  Un film françaisSidonie    au   Japon  .  pptx  Un film français
Sidonie au Japon . pptx Un film françaisTxaruka
 
Computer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptxComputer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptxRayane619450
 
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxikospam0
 
Boléro. pptx Film français réalisé par une femme.
Boléro.  pptx   Film   français   réalisé  par une  femme.Boléro.  pptx   Film   français   réalisé  par une  femme.
Boléro. pptx Film français réalisé par une femme.Txaruka
 
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfCOURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfabatanebureau
 
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...Technologia Formation
 
L application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptxL application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptxhamzagame
 

Dernier (18)

Chapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon CoursChapitre 2 du cours de JavaScript. Bon Cours
Chapitre 2 du cours de JavaScript. Bon Cours
 
Cours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdfCours Préparation à l’ISO 27001 version 2022.pdf
Cours Préparation à l’ISO 27001 version 2022.pdf
 
Apolonia, Apolonia.pptx Film documentaire
Apolonia, Apolonia.pptx         Film documentaireApolonia, Apolonia.pptx         Film documentaire
Apolonia, Apolonia.pptx Film documentaire
 
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...
L'ÉVOLUTION DE L'ÉDUCATION AU BRÉSIL À TRAVERS L'HISTOIRE ET LES EXIGENCES DE...
 
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projetFormation échiquéenne jwhyCHESS, parallèle avec la planification de projet
Formation échiquéenne jwhyCHESS, parallèle avec la planification de projet
 
Les roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptxLes roches magmatique géodynamique interne.pptx
Les roches magmatique géodynamique interne.pptx
 
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
GIÁO ÁN DẠY THÊM (KẾ HOẠCH BÀI DẠY BUỔI 2) - TIẾNG ANH 6, 7 GLOBAL SUCCESS (2...
 
Bilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdfBilan énergétique des chambres froides.pdf
Bilan énergétique des chambres froides.pdf
 
Cours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdfCours ofppt du Trade-Marketing-Présentation.pdf
Cours ofppt du Trade-Marketing-Présentation.pdf
 
Formation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptxFormation qhse - GIASE saqit_105135.pptx
Formation qhse - GIASE saqit_105135.pptx
 
La nouvelle femme . pptx Film français
La   nouvelle   femme  . pptx  Film françaisLa   nouvelle   femme  . pptx  Film français
La nouvelle femme . pptx Film français
 
Sidonie au Japon . pptx Un film français
Sidonie    au   Japon  .  pptx  Un film françaisSidonie    au   Japon  .  pptx  Un film français
Sidonie au Japon . pptx Un film français
 
Computer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptxComputer Parts in French - Les parties de l'ordinateur.pptx
Computer Parts in French - Les parties de l'ordinateur.pptx
 
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptxCopie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
Copie de Engineering Software Marketing Plan by Slidesgo.pptx.pptx
 
Boléro. pptx Film français réalisé par une femme.
Boléro.  pptx   Film   français   réalisé  par une  femme.Boléro.  pptx   Film   français   réalisé  par une  femme.
Boléro. pptx Film français réalisé par une femme.
 
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdfCOURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
COURS SVT 3 EME ANNEE COLLEGE 2EME SEM.pdf
 
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
Conférence Sommet de la formation 2024 : Développer des compétences pour la m...
 
L application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptxL application de la physique classique dans le golf.pptx
L application de la physique classique dans le golf.pptx
 

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