Exécuter des traitements longs sans bloquer l'utilisateur ⏱
Exécuter des traitements parallèlement plutôt que séquentiellement
Ne pas bloquer l'utilisateur si l'imprimante n'a plus de papier !
Action | Latency | # of cycles | Human Time |
---|---|---|---|
1 Cycle CPU (3GHz Clock) | 0.3 ns | 1 | 1 s |
Level 1 cache access | 0.9 ns | 3 | 3 s |
Level 2 cache access | 2.8 ns | 9 | 9 s |
Level 3 cache access | 12.9 ns | 43 | 43 s |
Action | Latency | # of cycles | Human Time |
---|---|---|---|
RAM access | 70 - 100 ns | 233 - 333 | 3.5 - 5.5 m |
NVMe SSD | 7 - 150 µs | 23k - 500k | 6.5 h - 5.5 d |
Rotational disk | 1 - 10 ms | 3 - 30 M | 1 - 10 months |
Internet: SF to NYC | 40 ms | 130 M | 4.2 years |
Comment exécuter plusieurs choses en même temps ?
Un CPU exécute un seul process à la fois
Le système d'exploitation switche entre les process pour leur donner le CPU
Exécution de plusieurs process en parallèle
Comment exécuter des choses en parallèle dans un même process ?
Permet l'exécution de plusieurs tâches (threads) dans un même programme
Les threads se partagent la mémoire du process
Un des premiers langages à rendre le multithreading "facile" pour les développeurs
La gestion du multithreading se fait à l'aide des classes java.util.concurrent.*
Thread
java par connexion HTTPSystem.out.println(Thread.currentThread().getName());
Threads
sont maintenus en vie dans un pool
implémenter l'interface Runnable...
... en java 8 avec une lambda
⚠️ à bien utiliser la méthode start
la méthode run
exécuterait le code donné dans le thread "courant"
Comment récupérer un résultat ?
depuis Java ☕ 5 ! (si, si !)
Future<T>
représente un résultat asynchroneCallable<T>
représente une tâche retournant un résultatExecutorService
gère l'exécution de tâches asynchones Runnable
ou Callable<T>
Exécution d'un Callable
Exécution de plusieurs Callable
depuis Java ☕ 8
CompletableFuture<T>
est une Futurestatic
pour exécuter des
Runnable
/Callable
sans ExecutorService
Gérer le chargement asynchrone d'une liste
Taille du pool de threads par défaut : Nb CPU - 1
Permet de laisser un CPU disponible au Thread principal et à l'OS
Si un seul CPU dispo, pas de pool de Thread, un Thread sera créé pour chaque tâche
Attention au contexte d'exécution (docker) et à ce pool partagé
Possibilité d'exécuter des streams Java en parallèle - Proche de l'asynchronisme
En séquentiel :
En synchrone, chaque opération se fait dans le thread principal
En parallèle
En parallèle, chaque opération se fait dans le pool de thread. Le thread principal assure lui aussi sa part du travail
Je n'ai pas besoin de Threads, Tomcat 😺 est déjà multithreadé
Tomcat alloue un thread pour chaque requête entrante. Nous avons besoin de threads supplémentaires pour :
Cours suivant :
High-Availability & micro-services
patterns