COURS THREADING

Programming, Java, Multi-Threading · course

Browse all programmation documents

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) ;}

Advertisement

}

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")) ;

Advertisement

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)

Advertisement

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

Advertisement

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