Plan du cours 5:Threads introduction Définition Création des Threads

Slides:



Advertisements
Présentations similaires
Formation universitaire à .NET: Introduction à C#
Advertisements

Le mécanisme des exceptions
Classe : …………… Nom : …………………………………… Date : ………………..
Calculs de complexité d'algorithmes
Les Prepositions.
TP 7.1 synchronized et join Écrire un programme Java qui crée 1000 threads et maintient un compteur nb du nombre de threads créés jusque-là. Le thread.
Introduction à Java - les « Threads » -
Faisons une interface réactive.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV Threads Module Java Expert.
Primitives - Intégration
JDBC: manipuler une base de données en Java IFT6800 – E 2007 Jian-Yun Nie.
Les entrées /sorties en Java François Bonneville
Connexion base de données
Chapitre IV Object, interfaces, classes imbriquées.
Injection de dépendances
BlueJ_XI 1 Java, les objets : tout de suite ! Gestion des erreurs : les exceptions Notes de cours associées au chapitre 11 tutorial BlueJ
Faculté I&C, Claude Petitpierre, André Maurer 1 Systèmes multi-processus C. Petitpierre
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
CYCLE 3 : Alternatives Faire des choix dans un programme en C 1- AIGUILLAGE SIMPLE sur CONDITION : if-else 2-AIGUILLAGE MULTIPLE sur CONDITIONS if-else.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 La Concurrence Déclarative Peter Van Roy Département dIngénierie Informatique, UCL
La compilation logicielle dEsterel v5 Gérard Berry Chaire Algorithmes, machines et langages Collège de France Cours 4, 23 avril 2013.
Cours du 19 octobre. POO-L3 H. Fauconnier2 E) Constructeurs et héritage Le constructeurs ne sont pas des méthodes comme les autres: le redéfinition na.
Badr Benmammar Programmation concurrente et temps réel en Java Badr Benmammar
1 Les pointeurs et quelques rappels sur certains éléments du langage C.
Master 1 SIGLIS java Lecteur Stéphane Tallard Chapitre 4 – Structures de contrôle.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
Classes abstraites et Interfaces
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
NSY102 1 Concurrence compléments Notes de cours Cnam Paris jean-michel Douin, douin au cnam point fr 19 Mars 2007.
Le patron de conception « Strategy » Simon Durocher ( )
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
JUnit Présentation complète de JUnit et « guide d’utilisation » en 13 transparents.
Programmation concurrente
CSI2520, Hiver 2007 Programmation concurrente. CSI2520, Hiver 2007 Programmation concurrente La programmation est distribuée lorsque les processus ne.
Faculté I&C, Claude Petitpierre, André Maurer Le parallélisme Introduction.
Notre calendrier français MARS 2014
Multi-Thread Jian-Yun Nie
PROGRAMMATION MULTI-TÂCHES (MULTITHREADING)
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
Exceptions IFT1025: Programmation 2 Jian-Yun Nie.
Badr Benmammar Formation Développeur Java Thread et Swing Badr Benmammar
Badr Benmammar Programmation concurrente et temps réel en Java Badr Benmammar
3ème partie: les filtres
Java Swing.
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
Cours 6 décembre. Collections POO-L3 H. Fauconnier3 Collections types de données interfaces implémentations algorithmes Interfaces:
COURS DE PROGRAMMATION ORIENTEE OBJET :
CSI1502 Principes fondamentaux en conception des logiciels Chapter 8: Gestion des exceptions.
Android UIThread, Thread, Handler et AsyncTask
C'est pour bientôt.....
Veuillez trouver ci-joint
Synchronisation Classique
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Structures des données
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Introduction à la programmation (420-PK2-SL) cours 20 Gestion des applications Technologie de l’information (LEA.BW)
27/02/2006L3 MIAGE - GLO ADA1 Les Paquetages Permettent d’encapsuler un groupe d’entités logiquement reliées. Comme toute unité de programme, le paquetage.
10 paires -. 9 séries de 3 étuis ( n° 1 à 27 ) 9 positions à jouer 5 tables Réalisé par M..Chardon.
CALENDRIER-PLAYBOY 2020.
LES PILES ET FILES.
Programmation Système et Réseau
Héritage H. Batatia. plan Notion (que signifie l’héritage) Ecriture en java Héritage multiple (interdit) Instanciation (partie propre et partie héritée)
Introduction à la programmation objet avec java
Frédéric Le Mouël, Stéphane Frénot, Frédérique Laforest, Tarak Chaari – Dpt TC JAV 1 JAV – TD 8 Les threads en Java.
Transcription de la présentation:

Plan du cours 5:Threads introduction Définition Création des Threads Gestion des priorités Synchronisation

Introduction(1) Les structure de contrôle: If ….. Else….. While ……… Switch……. Try…..catch….. Offrent un modèle d’ordre pour l’exécution de block d’instruction Structures conditionnelle: ou bien le bock if ou le bock else est exécuté jamais les deux en même temps

main() int x=1+2; C y=new C(); y.m1(x); Class C …. If x= =0 {….. ….traitement1…. Else …..traitement2 } …..traitement3… Structure de contrôle offre des modèles d’exécution différent Mais….une chose est sûr la séquentialité de l’exécution = deterministe Class C …. {….. Public void m1(int x) {….traitement m1…. }

La notion de parallélisme Public Class C1{ Public static void main() {SOP(« je suis c1 »); SOP(« je suis c1 bis »); } Public class test{ Public static void main() { C1.main(); C2.main(); } Public Class C2{ Public static void main() {SOP(« je suis c2 »); SOP(« je suis c2 bis »); } Question: Quel sera l’affichage?

La Réponse plusieurs cas possible: C1 C1bis C2 C2bis C1 C2 C1bis C2bis Tous les arrangement possible en respectant l’ordre entre c* et c*bis

Qu’est ce qui se passe?? Chaque méthode main représente un programme appart entier (processus). Quand la méthode main de la classe teste lance les deux main de C1 et C2 elle crée deux autre programme qui vont s’exécuté parallèlement. Il y a une seul machine java alors… c’est un pseudo parallélisme (illusion de parallélisme): la machine va partager ses ressources d’exécution entre les deux programmes en alternant l’exécution des deux programmes Résultat: l’exécution se chevauche dans un ordre qui dépend de la machine

Pseudo-parallélisme Test C1 C2 C1.main(); Machine virtuel C2.main(); SOP(«c1 »); C1 c2 c1 C2.main « c1bis » C2 Machine virtuel

Définition Thread : séquence autonome d’exécution d’instructions au sein d’un programme  Donne l’illusion de parallélisme de l’exécution des bouts de programmes (pas besoin de le mettre dans un main) Délivre un parallélisme réel sur une machine multiprocesseur

Nature des Threads Un Thread est un «processus» : Léger : pas de réservation de ressources système (fichiers, canaux, signaux), Simple : 1 registre Compteur de Programme et une pile. Sur un ordinateur, à un instant donné, il n’y a qu’UN SEUL THREAD en cours d’exécution, et éventuellement d’autres threads en attente d’exécution

La différence entre les Thread et les mains Tous les Threads partagent le même espace mémoire au sein de la machine virtuelle Ils peuvent accéder à tous les objets publics Ils peuvent modifier tous les objets publics Mémoire Thread1 + Thread2 Thread1 Mémoire C1 C1.main() Thred2 Mémoire C1 C1.main()

pourquoi les Threads? Certain bout de code sont indépendants (pas de relation d’ordre) donc gain de clarté et de rapidité Exemple si vous devez saisir des données du clavier (un utilisateur lourd ou absent). pourquoi bloquer le code qui ne dépend pas des données? Solution: mettre les entré sortie et le code qui en dépends dans une Thread. Pendant l’attente des données l’autre programme peut s’exécuter des application peuvent nécessité un parralélisme Programme distribué Chronométré un programme

Pour créer des Threads… Deux méthodes, un point commun : « écrire une méthode run() qui fait ce que doit faire le thread. » Méthode 1 : Dériver une classe de Thread. Méthode 2 : implémenter l’interface Runnable.

L’interface Runnable interface Runnable { public abstract void run() ; } Un objet « runnable » est un objet que l’on peut lancer en faisant run()…

La classe Thread public class Thread implements Runnable { public static final int MAX_PRIORITY, MIN _PRIORITY, NORM _PRIORITY; public Thread(); public Thread(String name); … public static Thread currentThread(); public static void sleep(long millis); // arrête le thread pour un millis seconde public static void wait(); //arrête le thread en attendant une notification public static void notify(); // notification des threads en attentes par wait public static void suspend(); public static void resume(); public static void start(); public static void stop(); public static void run(); }

Dériver une classe de Thread public class SimpleThread extends Thread { public void run() { code exécuté dans un processus propre } Quelque part…. Partie Utile SimpleThread unSimpleThread = new SimpleThread(); unSimpleThread.start(); … Ailleurs...

Implémenter l’interface Runnable public class Clock implements Runnable { public void run() { while(true){ …} } Quelque part…. Partie Utile Clock uneClock = new Clock(); Thread thread = new Thread(uneClock); thread.start(); … Cible Runnable Ailleurs...

exemple Écrire un programme qui saisie un caractère du clavier public class Timer extends Thread { int compteur; public Timer() { } public void run(){ while(true){ try{sleep((long)1000);} catch(Exception e){} compteur++;} }} ****************************************************** public static void main(String[] args) {Timer crono=new Timer(); crono.start(); InputStreamReader clavier= new InputStreamReader(System.in); try{clavier.read();} catch(IOException e){} System.out.println("vous avez mis "+crono.compteur+" secondes"); crono.stop();} exemple Écrire un programme qui saisie un caractère du clavier Changer le code pour que le programme affiche le temps que l’utilisateur à mis pour saisir le caractère.

Etats d’un thread (cycle de vie) Naissance « IllegalThreadStateException » mort fin de run() start() - I/O bloquante - wait() - sleep() Executable Non Executable - délai écoulé - notify() - I/O débloquée

Comment arrêter un thread ? Pas de méthode ad-hoc : (stop, suspend, etc. sont DEPRECATED) Il faut que la méthode run() termine d’elle-même Exemple : public void run() { (1) while (compteur++ < 100000) {…} (2) while (varBool == true) {…} }

Gérer le partage du temps Gestion des Threads Pour le système, gérer des threads, c’est…. Gérer le partage du temps + Gérer des priorités Modèle de gestion des threads par la JVM : fixed priority scheduling (algorithme déterministe) « comment faire tourner plusieurs threads alors que votre ordinateur ne possède qu  ’un seul processeur ? : A tout moment , il n ’y a en fait qu ’un seul thread en cours d ’éxecution , et éventuellement d ’autres threads en attente d ’execution » Partage de temps d ’execution : un petit bout de temps, céder le contrôle au système, attribution de la ressource cpu au prochain thread…. Etc… Seul contrôle possible : priorité des threads entre eux. Pour les threads de même priorité : round robin…. Attention a la préhemption, pas toujours possible suivant les systèmes : pour ne pas dépendre de l ’architecture cible : utiliser yield() ou sleep()

Gestion par priorités assignées Priorité croissante « manège » (round robin) thread de priorité supérieure ==> Préemption. Il est préférable que chaque thread rende la main de manière volontaire (éviter les threads «égoïstes»)

Gestion des priorités (1) Chaque thread possède une priorité égale à NORM_PRIORITY (5) définie entre MIN_PRIORITY (1) et MAX_PRIORITY (10), constantes de la classe Thread A tout moment, quand plusieurs threads sont «runnables», le thread de plus haute priorité est choisi. Si ce thread stoppe ou est suspendu pour une raison quelconque, alors, un thread de priorité inférieure peut s’exécuter.

Gestion des priorités (2) Si un thread de priorité supérieure doit s’exécuter (fin de sleep(), fin d’I/O, notify()…), il y a préemption. Le Runtime Java ne fera pas de préemption d’un thread pour un autre de même priorité. Le runtime Java ne fait pas de « time-slicing ». MAIS, il se peut que l’OS sous-jacent SUPPORTE le time-Slicing Moralité : n’écrivez pas de code dont le fonctionnement repose sur le time-slicing.

Exercice 1 Ecrire une classe Ping qui réalise un Thread qui affiche « Ping » à intervalle irrégulier Ecrire une classe Pong qui réalise un Thread qui affiche « Pong » à intervalle irrégulier Ecrire une classe Go qui lance les Threads Ping et Pong

Exercice 1 (1) import java.io.*; class Ping extends Thread{ public void run(){ try{ while (true){ System.out.println(« Ping »); sleep((long)500*Math.random()); } catch(InterruptedException e){ return;}

Exercice 1 (2) import java.io.*; class Pong extends Thread{ public void run(){ try{ while (true){ System.out.println(« Pong »); sleep((long)500*Math.random()); } catch(InterruptedException e){ return;}

Exercice 1 (3) import java.io.*; class Go { public static void main(String args[]) { Ping p1 = new Ping(); Pong p2 = new Pong(); p1.start(); p2.start(); }

La Synchronisation

Problématique: Synchronisation Soit une classe Compte Bancaire public static void main(String[] args) {CompteBancaire cp=new CompteBancaire(100); Retrait marie=new Retrait(cp); Retrait epouse=new Retrait(cp); marie.start();epouse.start(); } public class Retrait extends Thread{ CompteBancaire compt; public Retrait(CompteBancaire b) {compt=b;} public void run() { while(compt.retrait(100)) { System.out.println("retrait total");}} } public class CompteBancaire { private float total; public CompteBancaire(float init){total=init;} public boolean retrait(float t){ if (t<=total) {total -=t; return true;} return false; }}

Solution Il faut bloquer le retrait quand un détenteurs du compte commence un retrait (exécution exclusif) Solution : placer le bout de code critique dans un bloque garder par le mot synchronized Le mot clé synchronized informe la machine que ce bloque ne peut être instancier ou exécuté que par un seul thread à la fois Conséquence direct: le Thread qui commence un bloque synchronized à l’exclusivité de l’exécution.

Synchronisation. Pourquoi (1)? Tous les objets sont partagés entre tous les Threads lecture Objet UnObjet lecture calcul double var; calcul écriture écriture 2 sections critiques non protégées Thread 1 Thread 2

Section critique Comment protéger une section critique ? En java, par un bloc « synchronized » : (bloc, méthode) Un seul thread accède au code synchronized à un moment donné. Protection efficace mais basique…. wait() : met le thread en attente (sans perte de cycles CPU…) et relâche le verrou notify() et notifyAll() : libèrent un ou tous les threads de l’état wait

Solution pour le compte bancaire public class CompteBancaire { private float total; public CompteBancaire(float init){total=init;} synchronized public boolean retrait(float t){ if (t<=total) {total -=t; return true;} return false; }}

Autre type de synchronisation: sémaphore Exemple ping pong affiche des suite varié de mot ping et pong : (ping|pong)* On veut changer le code de tel façon que le langage généré soit: (ping pong)* L’idée est d’utilisé la notion de drapeau ou sémaphore : Solution: Chaque thread doit garder son code par une variable qui lui block l’exécution et permet a son concurrent de s’exécuter

Producteur/Consommateur - Un drapeau indique qu’une valeur a été déposée - Un drapeau indique qu’une valeur a été consommée Fichier…Objet.. Thread 1 (producteur) Méthode traditionnelle : « Attente active » Thread 2 (consommateur)

Exercice ping pong Ecrire une classe Sem qui implémente un sémaphore : elle contient un champ booléen curval et deux méthodes get(boolean val) et set(boolean val). La méthode get(boolean val) attend que curval soit égal à val pour continuer La méthode set(boolean val) positionne curval à val Get et set définissent une section critique

Exercice 2 (2) Modifier les classes Ping et Pong pour qu’elles affichent leur message chacune à leur tour…

Solution Exercice 2 (1) class Drapeau { boolean vert; Drapeau(){vert=true;} boolean get(boolean couleur){ while (couleur!=vert){ try{wait();}catch(Exception e){} } return true; voit set(boolean couleur){ curval=couleur; notify();

Solution Exercice 2 (2) import java.io.*; class Ping extends Thread{ boolean couleurPing=true; Drapeau m; public Ping(Drapeau m0){m=m0;} public void run() try{ while (true){ m.get(couleurPing); System.out.println(« Ping »); m.set(!couleurPing); sleep((long)200*Math.random()); } }catch(InterruptedException e){ return;}

Solution Exercice 2 (3) import java.io.*; class Pong extends Thread{ boolean couleurPong=false; Drapeau m; public Pong(Drapeau m0){m=m0;} public void run() try{ while (true){ m.get(couleurPong); System.out.println(« Pong »); m.set(! couleurPong); sleep((long)200*Math.random()); } }catch(InterruptedException e){ return;}

Y a un problème. Le quel?

Solution Exercice 2 (1) synchronized voit set(boolean val){ class Drapeau { boolean curval; Drapeau(){curval=true;} synchronized boolean get(boolean val){ while (val!=curval){ try{wait();}catch(Exception e){} } return true; synchronized voit set(boolean val){ curval=val; notify();

L’heure, c’est l’heure !