Plan du cours 5:Threads



Documents pareils
J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Synchro et Threads Java TM

Threads. Threads. USTL routier 1

Introduction : les processus. Introduction : les threads. Plan

Un ordonnanceur stupide

INITIATION AU LANGAGE JAVA

Notion de thread (1/2)

Corrigé des exercices sur les références

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Programmer en JAVA. par Tama

Introduction à la programmation concurrente

Problèmes liés à la concurrence

PIGOURIER Vincent ANNEE SPECIALE 99/00 RAPPORT DE PROJET : LES THREADS JAVA. Responsable : Serge Rouveyrol

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Cours de Systèmes d Exploitation

Plan du cours. Historique du langage Nouveautés de Java 7

as Architecture des Systèmes d Information

On appelle variable condition une var qui peut être testée et

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Projet de programmation (IK3) : TP n 1 Correction

Exercices INF5171 : série #3 (Automne 2012)

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Remote Method Invocation Les classes implémentant Serializable

Java Licence Professionnelle CISII,

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Programme Compte bancaire (code)

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Premiers Pas en Programmation Objet : les Classes et les Objets

Auto-évaluation Programmation en Java

Support de cours Java

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Une introduction à Java

Java Licence Professionnelle CISII,

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Cours 2: Exclusion Mutuelle entre processus (lourds, ou légers -- threads)

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Langage Java. Classe de première SI

TD2 Programmation concurrentielle

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

SugarCubes. Jean-Ferdinand Susini Maître de Conférences, CNAM Chaire systèmes enfouis et embarqués. Paris, le 9 janvier, 2009

Calcul Parallèle. Cours 5 - JAVA RMI

TP1 : Initiation à Java et Eclipse

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Programmation en Java IUT GEII (MC-II1) 1

Dis papa, c est quoi un bus logiciel réparti?

Programmation d Applications Concurrentes et Distribuées (INF431)

Tp 1 correction. Structures de données (IF2)

Objets et Programmation. origine des langages orientés-objet

ACTIVITÉ DE PROGRAMMATION

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Les processus légers : threads. Système L3, /31

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

TD3: tableaux avancées, première classe et chaînes

Apprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)

Package Java.util Classe générique

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Introduction aux systèmes temps réel. Iulian Ober IRIT

Chapitre 10. Les interfaces Comparable et Comparator 1

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Introduction au langage Java

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Modèle à composants. Daniel Hagimont. IRIT/ENSEEIHT 2 rue Charles Camichel - BP TOULOUSE CEDEX 7. Remerciements

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Derrière toi Une machine virtuelle!

PROGRAMMATION EVENEMENTIELLE sur EXCEL

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Introduction aux Systèmes et aux Réseaux

Java - la plateforme

Développement Logiciel

Exercices sur les interfaces

Remote Method Invocation (RMI)

Corrigés des premiers exercices sur les classes

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

La JVM. La machine virtuelle Java. La JVM. La JVM

Exécutif temps réel Pierre-Yves Duval (cppm)

Gestion distribuée (par sockets) de banque en Java

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Une introduction à la technologie EJB (2/3)

I-JVM: une machine virtuelle Java pour l isolation de composants dans OSGi

Programmation Par Objets

Utilisation d objets : String et ArrayList

Cours 1: Java et les objets

PROGRAMMATION PAR OBJETS

Cours Programmation Système

Introduction au langage C

Programmation Internet en Java

INF 321 : mémento de la syntaxe de Java

Programmation concurrente et Java. Les Threads en Java : une première approche

Transcription:

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

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 Page : 2

main() int x=1+2; C y=new C(); y.m1(x); If x= =0.traitement1. Else..traitement2..traitement3 Class C. {.. Public void m1(int x) {.traitement m1. 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 Page : 3

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

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

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 Page : 6

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

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 Page : 8

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 Page : 9

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 C1 Mémoire C1 C1.main() C1.main() Mémoire Thread1 + Thread2 Thread1 Thred2 Page : 10

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 Page : 11

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. Page : 12

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

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(); Page : 14

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

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

public class Timer extends Thread { int compteur; exemple public Écrire Timer() un { programme qui saisie un caractère du clavier public void run(){ while(true){ try{sleep((long)1000); Changer code catch(exception pour que le e){ programme affiche compteur++; le temps que l utilisateur à mis pour saisir le caractère. ****************************************************** 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(); Page : 17

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

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) { Page : 19

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) Page : 20

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») Page : 21

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. Page : 22

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. Page : 23

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 Page : 24

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; Page : 25

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; Page : 26

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(); Page : 27

La Synchronisation Page : 28

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; Page : 29

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. Page : 30

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

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 Page : 32

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; Page : 33

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 Page : 34

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) Page : 35

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 Page : 36

Exercice 2 (2) Modifier les classes Ping et Pong pour qu elles affichent leur message chacune à leur tour Page : 37

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(); Page : 38

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; Page : 39

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; Page : 40

Y a un problème. Le quel? Page : 41

Solution Exercice 2 (1) 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(); Page : 42

L heure, c est l heure! Page : 43