# Cour -- Pratique de la concurrence ###### tags `cour` `M1 S1` `Concurrence` [Somaire](IAsAMpizSpawifCj1gZ__g#) > [time= 16 sept 2020] [TOC] ## class Thread [man page Thread](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html)\ - **Thread(); Thread(Runable runable)**\ crée l'objet thread (avec *new*) - **run()**\ code à executer - **start()**\ démare le thread (et le retourne immédiatement) - **join()**\ permet d'attendre la fin du thread - **yield()**\ redonne la main au scheduler - **sleep(long t)**\ attend pendant un temps *t* (en milliseconde) - **interupt / interupted()** intérompt le thread - **setPriorty / getPriority**\ Donne la priorité du thread - **setDaemon/isDeamon**\ dit si le thread est en *deamon* ou en *user* L'execution des threads sont ++asynchrones++ et ++concurrentes++. ++asynchrones++: pas de garantie de l'ordre des threads ```java= public class MyClass extends Thread { public void run() { //... } } public class Main { public static void main(String args[]) { MyClass thread = new MyClass(); thread.start(); } } ``` ## Interface Runnable [Runnable man Page](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html ) - *run*\ Méthode à implémenter Avec un Runable on peut crée un thread. ```java= public class MyClass implements Runnable { public void run() { //... } } public class Main { public static void main(String args[]) { MyClass runnable = new MyClass(); Thread t =new Thread(runnable); t.start(); } } ``` ## Lecture et écriture En java il y a **atomicité** en lecture écriture pour: - les variables des types primitifs **sauf** ++long++ et ++double++ - pour les variables déclarées comme volatile *(pas d'optimisation de code)* > [time= 22 sept 2020] ## Verrous / lock On peux vérouiller une **expression** dans l'instruction déclarer: **synchronized(expr){instruction}** ```java= public class MyClassSynchonizer { private final Object monMonitor = new Object(); public void maMethode1() { synchronized(monMonitor) { // ... } } public synchronized void maMethode2() { //... } } ``` Ou sur une méthode. [tuto synchronize java](https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html) ## synchronization [man page Object](https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html)\ attend que une condition soir réaliser pour poursuivre - wait\ On attend (utiliser la condition avec un while) - notify\ reveil 1 processus - notifyAll\ reveil tout les processus ## Objet concurent de haut niveau - Java.utils.concurrent.lock - wait/notify conditions - Exhanger, Barrières, sémaphores - JAVA.util.concurrent.atomic - Collection concurent ## Lock / Condition Interface Lock: - lock() - unlock() - trylock() - newConditions() Implémentée apr - Class ReentrantLock - Class ReentrantReadWriteLock Interface condition: - await() - signal() - signalAll()\ Associcée à un lock [man page ReentrantLock](https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html) ## Exchanger Permet d'échanger des valeurs ## Barrières On utilise un compteur quand le compteur est a 0 la barière est levé. On fait attendre tout le monde à la barriere, pour qu'il passe tous d'un coup! ## Cyclic barriere ## phaser ## sémaphore Initialiser a une valeur n, nombre de permis qui peuvent passer. méthode: - aquire() - release() ## Atomic ## Callable et Future thread qui retourne des valeurs ## Executor Execute plusieurs runable [man page Executor](https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html) ## ForkJoinPool