COURS
THREADING
JAVA
1
PROGRAMMATION PARALL LE
q Processus = unit fonctionnelle
Code
Donn es
Ressources
Syst me
dexploitation
" Un processus est une unit dex cution qui poss de son
code, son espace m moire et un acc s des ressources
g r es par le syst me dexploitation
" La vie dun processus est g r e par
dexploitation
le syst me
q Ex cution
Processus 1
Processus 2
Syst me
dexploitation
Temps CPU
" La communication entre les processus seffectue
par des m canismes offerts par le syst me
dexploitation
2
Inconv nients dun
processus
Un processus est co teux en m moire (code
+ donn es)
Le partage des donn es entre processus est
difficile r aliser
Le lancement dun processus est
relativement lent cause de :
Sa taille,
La charge du syst me dexploitation
Le partage de certaines ressources syst mes
est difficile, parfois impossible
Classiquement les programmes ne poss dent
quun seul processus !
3
THREAD ET
UTILIT DU MULTI-THREADING
qD finition :
Un Thread est un processus interne un
processus
Un processus comporte un ou plusieurs Threads
Les Threads dun processus partagent son code,
ses donn es et ses ressources mais peuvent aussi
disposer de leurs donn es propres
Les Threads dun processus peuvent sex cuter
en parall le (OS d pendant)
qAvantages :
L g ret ( light weight process ou
processus l ger ) gr ce au partage des
donn es (meilleures performances au lancement
et en ex cution)
Partage des ressources syst mes du processus
Java est un langage multi-Thread , cette
qualit d pend du support des Threads et du
multi-Threading du syst me dexploitation
4
LA CLASSE JAVA.LANG.THREAD
q La classe Thread est la classe
dimpl mentation dun Thread
q Elle dispose de lensemble des services de
gestion dun Thread :
Cr ation et destruction
Gestion de l tat
Synchronisation
&
q Pour b n ficier du multi-Threading, il y a deux
utilisations possibles :
1.
Sous-classer Thread car toute instance dune
sous-classe de Thread est un Thread
2. D finir une association entre la classe
utiliser et la classe Thread
5
SOLUTION 1: SOUS-CLASSER
THREAD
Exemple :
class ActionDeCuisine extends Thread
{ private String afaire ;
public ActionDeCuisine(String afaire)
{ this.afaire = afaire ; }
public void run ( )
{ for (int i=0 ; i<2 ; i++) System.out.println(afaire) ;}
Publicité
}
class Recette
{
public static void main(String[ ] args) {
ActionDeCuisine a1 = new ActionDeCuisine("Battre les
Sufs");
ActionDeCuisine a2 = new ActionDeCuisine("Faire
fondre le
Chocolat");
ActionDeCuisine a3 = new ActionDeCuisine("Ajouter
du sucre");
a1.start ( ) ;
a2.start ( ) ;
a3.start ( ) ; }
}
6
R SULTAT
Le r sultat exact de cet exemple d pend du syst me
d'exploitation.
R sultats possibles :
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
Battre les Sufs &
Battre les Sufs
Faire
fondre
le chocolat
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
Faire fondre le chocolat
Ajouter du sucre
Ajouter du sucre
7
SOUS-CLASSER THREAD (SUITE)
La classe Thread
est la classe de base
dimpl mentation du multi-Threading dans
Java. Sousclasser Thread permet de cr er
des classes dobjets qui pourront sex cuter en
parall le
Les m thodes run ( ) et start ( ) :
void start ( )
Permet de demander au Thread concern de
d marrer (asynchrone : cette fonction redonne
imm diatement la main pour la suite des
instructions).
void run ( )
M thode red finir pour d crire les actions
le contenu de cette
d'un Thread
m thode qui repr sente les actions du Thread
et qui sera donc ex cut apr s que le Thread
aura t d marr par la m thode start( ) )
(c'est
8
PRINCIPE DE FONCTIONNEMENT
Un
syst me
d'exploitation multi-Thread
affecte des tranches de temps chaque Thread
activable : il interrompt le Thread actif quand
une tranche de temps est coul e et passe le
contr le au Thread
activable suivant. Le
Thread initial ne reprendra donc la main que
lorsque son tour reviendra, apr s que les autres
Threads activables auront puis leur tranche
de temps.
La dur e des tranches de temps peut tre tr s
diff rente d'une machine une autre, ce qui
explique les diff rences de comportement d'un
syst me un autre.
9
SOLUTION 2: IMPL MENTER
LINTERFACE RUNNABLE
class ActionDeCuisine implements Runnable
{
private String afaire ;
public ActionDeCuisine(String afaire)
{ this.afaire = afaire ; }
public void run()
{for (int i = 0 ; i<4 ; i++) System.out.println(afaire) ;}
}
class Recette {
public static void main(String[] args)
{
Thread a1 = new Thread (new ActionDeCuisine("Battre les
Sufs")) ;
Thread a2 = new Thread (new ActionDeCuisine("Faire
fondre le Chocolat")) ;
Publicité
Thread a3 = new Thread (new ActionDeCuisine(" Ajouter du
sucre")) ;
a1.start() ;
a2.start() ;
a3.start() ;
}
}
10
IMPL MENTER LINTERFACE
RUNNABLE
(SUITE)
La classe Thread admet un constructeur qui
prend en argument une instance de Runnable
Linterface Runnable ne contient que la
m thode run ( ) qui sera appel e lors du
d marrage du Thread .
La classe qui contient le code a ex cuter en
l'interface
impl menter
doit
parall le
Runnable
Lavantage
linterface
dimpl menter
Runnable par une classe est que celle-ci peut
tendre une autre classe au choix (puisque
Java ne permet pas lh ritage multiple)
11
IMPL MENTER LINTERFACE RUNNABLE
(SUITE)
Remarques :
Lorsquon est dans le code de la m thode
run ( ) , this retourne une r f rence sur
lobjet dont la classe impl mente Runnable
(r f rence sur ActionDeCuisine). Si lon
veut r cup rer une r f rence su le Thread
lui-m me il faut utiliser la m thode statique
static Thread currentThread ( )
la
de
On peut associer plusieurs Threads une
instance
impl mentant
Runnable. Ils partagent tous les m mes
attributs de cette classe. Par contre toute
variable cr e dans la m thode run ( ) sera
unique par Thread
classe
12
CHOIX DIMPL MENTATION DUN
THREAD
Sous-classer Thread
Quand?
Lorsque lon ne n cessite pas une super-classe particuli re,
ou que lon a aucun besoin de partage contexte
class MaClasse extends Thread {
&
public void run ( ) {// red finition de run } & }
Utiliser Runnable
Quand?
Lorsque la super-classe est conceptuellement impos e
(exemple : Applet) ou quun partage de contexte est requis
pour un nombre quelconque de Threads
class MaClasse extends Base implements Runnable {
&
public void run ( ) {// red finition de run } & }
13
LES TATS DUN THREAD
construction
start ( )
cr
actif
suspend ( )
sleep (&)
resume ( )
endormi
stop ( )
stop ( )
destruction
La m thode isAlive ( ) :
cr
actif
endormi mort
Retourne
false
true
true
false
14
LES TATS DUN THREAD
(SUITE)
Publicité
q Cr
Un Thread est cr comme nimporte quel objet Java,
par appel un constructeur. Lors de cette tape
aucune autre op ration que la r servation m moire
nest effectu e
q Actif
Le Thread est dans cet tat lorsque apr s la cr ation, il
est activ par start ( ) qui lance la m thode run ( ). Ou
encore lorsquil est r activ apr s s tre endormi. Il est
alors ajout la liste des Threads actifs qui sont
ex cut s en temps partag
q Endormi
Un Thread peut tre endormi et r activ de plusieurs
mani res :
sleep (long millisecondes) throws
InterruptedException endort le Thread pendant
lintervalle de temps sp cifi et le r veille lorsque ce
temps est coul
suspend ( ) endort un Thread et resume ( ) pourra alors
le r activer
q Mort
Quand la m thode run ( ) a termin son ex cution
Par un appel explicite stop ( )
15
PRIORIT S
qPrincipes
Un Thread A qui a une priorit sup rieure
celle dun autre Thread B est ex cut avant B.
Les Threads de m me priorit se partagent le
temps du processeur avec un ordre ind termin
(syst me dexploitation d pendant)
sa cr ation un processus a par d faut la
m me priorit que le processus qui lui a donn
naissance
Java offre la possibilit de fixer les priorit s
des diff rents Threads dun ex cutable
qM thodes de Thread
void setPriority (int) : modifie la priorit du
receveur en fonction du param tre. Cette
priorit doit tre comprise entre
int getPriority ( ) : permet de conna tre la
priorit dun Thread
Le niveau de priorit normal est donn par
la constante
public static final int NORM_PRIORITY
16
PRIORIT S (SUITE)
Le partage de temps CPU entre Threads de m me
priorit est totalement d pendant du syst me
dexploitation
Deux types de gestion de la ressource CPU
existent :
Time-slicing : La ressource CPU est partag e
quitablement entre Threads de m me priorit par
le syst me dexploitation
Pr emption: Le partage de la ressource CPU doit
tre g r explicitement par lutilisateur
Le Thread courant c de la ressource CPU un
autre Thread de m me priorit dans les cas
suivants :
Involontairement sur entr e-sortie
Implicitement sur passage l tat endormi
Volontairement par appel la m thode statique
public static void yield ( )
courant de passer
qui permet au Thread
imm diatement la main aux autres. Cette m thode
ne permet pas un Thread de priorit inf rieure
de sex cuter, seul un Thread de priorit gale
peut prendre la main
17
LA M THODE JOIN ( ) 1/2
Exemple :
class ActionDeCuisine extends Thread {
private String afaire ;
public ActionDeCuisine(String afaire)
{ this.afaire = afaire ; }
public void run ( ) { // le contenu du Thread
for (int i=0 ; i<2 ; i++)
{
} }
}
class Recette {
public static void main(String[ ] args)
{
ActionDeCuisine a1 = new ActionDeCuisine("Battre les
System.out.println(afaire) ;
Sufs");
ActionDeCuisine a2 = new ActionDeCuisine("Faire fondre
le Chocolat");
ActionDeCuisine a3 = new ActionDeCuisine("Ajouter du
Publicité
sucre");
a1.start() ;
a2.start() ;
a3.start() ;
System.out.println("Mettre au four") ;
}
}
18
R SULTAT
R sultat :
Mettre au four
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
19
LA M THODE JOIN ( ) 2/2
public void join ( ) throws InterruptedException : bloque
le thread en cours dex cution jusqu ce quil termine son
travail
Exemple modifi :
class Recette
{
public static void main(String[] args)
{
ActionDeCuisine a1 = new ActionDeCuisine("Battre
les Sufs");
ActionDeCuisine a2 = new ActionDeCuisine("Faire
fondre le Chocolat");
ActionDeCuisine a3 = newActionDeCuisine("Ajouter
du sucre");
a1.start( ) ;
a2.start( );
a3.start( ) ;
try {a1.join( ); a2.join( ); a3.join( ); }
catch (InterruptedException e) { }
System.out.println("Mettre au four") ;
}
}
20
R SULTAT
R sultat :
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
Battre les Sufs
Faire fondre le chocolat
Ajouter du sucre
Mettre au four
21
EXERCICE DAPPLICATION
22
CORRECTION
public void run (){
C =0;
for (int k= 0; k< B.length; k++){
C += A *B ;
System.out.println ( getName()+ travaille );
}
}
23
LANCEMENT DES THREADS
// Lancement des threads
MonThread []tabThread = new MonThread ;
int k = 0;
for (int i= 0; i< C.length; i++) {
for (int j= 0; j< C .length; j++)
{
tabThread = new MonThread (A, B, C, i, j);
tabThread .setName ("Thread"+k);
tabThread .start();
k++;
}
24
AFFICHAGE DU R SULTAT
try {
for (k= 0; k<nbThread; k++)
tabThread .join();
}
catch (InterruptedException ee){}
System.out.println("\n Matrice C");
for (int i= 0; i< C.length; i++) {
for (int j= 0; j< C .length; j++) {
System.out.print(C + " ");
}
System.out.println();
}
25