Vous êtes sur la page 1sur 16

Université Sidi Mohamed Ben Abdellah

Fa ulté des S ien es Fès

Programmation Réseau
So kets & Threads

Chakir LOQMAN

02/06/2021

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Plan

1 Introdu tion

2 Thread en Java

3 Serveur multithreadé

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Introdu tion
Dénition
Un thread est une unité d'exé ution faisant partie d'un programme. Cette
unité fon tionne de façon autonome et parallèlement à d'autres threads

Rle
Le prin ipal avantage des threads
est de pouvoir répartir diérents
traitements d'un même
programme en plusieurs unités
distin tes pour permettre leurs
exé utions "simultanées".
Le on ept de thread permet de
séparer l'exé ution d'un
programme en plusieurs pro essus
légers. Cha un s'exé ute en
parallèle dans le même espa e
d'adressage de façon on urrente.
Chakir LOQMAN FSDM Fès
Introdu tion
Thread en Java
Serveur multithreadé
Nouveau thread

Méthode 1
Première manière de réer un nouveau thread : étendre la lasse Thread
Le ode à exé uter doit être implémenté dans la méthode publi void
run() (héritée : sur harge)
La méthode start() héritée de la lasse démarre le thread

Via un thread à part Main()


publi l a s s Test e x t e n d s Thread { publi stati v o i d main ( String [℄
p u b l i v o i d run (){ args ){
System . out . println (" Bonjour SMI6 ); Test t=new Test ();
} t. start ();
} }

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Thread Java

Exemple
Classe Cal ulFa toriel al ule un fa toriel et a he le résultat à l'é ran

Via un thread à part


publi l a s s Cal ulFa toriel e x t e n d s Cal ul des fa toriels de 1 à 10
Thread {
p r o t e t e d i n t nb ;
...
publi v o i d run (){
Cal ulFa toriel f ;
i n t res = 1;
f o r ( i n t i =10; i >= 1; i - -) {
f o r ( i n t i =1; i <= nb ; i ++)
f = new Cal ulFa toriel(i );
res = res * i;
f . start ();
System . out . println ( '' fa toriel de ''+ nb + ''= ''+ res );
}
}
...
p u b l i Cal ulFa toriel( i n t nb ) {
t h i s . nb = nb ; }
}

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Nouveau thread

Méthode 2
Deuxième manière de réer un nouveau thread : réer un objet qui
implémente l'interfa e Runnable
Le ode à exé uter doit être implémenté dans la méthode publi void
run() (obligatoire)
On passe l'objet en paramètre du onstru teur d'un thread

Via un thread à part Main()


publi l a s s Test1 implements Runnable { publi stati v o i d main ( String [℄
Override args ){
publi v o i d run (){ Test1 p=new Test1 ();
System . out . println (" Bonjour SMI6 " ); Thread t=new Thread (p );
} t. start ();
} }

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Méthode stati sleep
sleep()
La méthode sleep est une méthode statique don il n'est pas né essaire
d'avoir une référen e sur l'instan e d'un thread pour l'appeler.
L'appel de ette méthode ause le thread ourant d'arrêter son exé ution
et de passer à l'état "En attente d'exé ution".
Lorsque e temps est é oulé, la JVM hange l'état du thread vers l'état
"Prêt à exé uté" (Runnable).
Exemple
publi l a s s TestSleep {
publi stati v o i d main ( String [℄ args ) throws InterruptedEx eption {
String inf [℄={ " Bonjour SMI 6" ," je suis " , " hakir " , " loqman " };
f o r ( String string : inf) {
Thread . sleep (4000);
System . out . println ( string );
}
}

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Les groupes de threads
Dénition
Un groupe de threads permet de regrouper des threads selon diérents
ritères et de les manipuler en même temps e qui évite d'avoir à ee tuer
la même opération individuellement sur tous les threads.
Exemple
publi l a s s Test1 implements Runnable {
Override
p u b l i v o i d run (){
System . out. println (" Bonjour SMI6 " );
}
}

Exemple
publi stati v o i d main ( String [℄ args ){
Test1 p=new Test1 ();
Thread t=new Thread (p );
System . out . println (" groupe :"+t. getThreadGroup(). getName ());
t. start ();
}
Chakir LOQMAN FSDM Fès
Introdu tion
Thread en Java
Serveur multithreadé
Groupes de threads
Dénition
La seule solution pour ajouter un Thread dans un groupe parti ulier est
d'utiliser une des sur harges du onstru teur de la lasse Thread qui
attend en paramètre un objet de type ThreadGroup.
Exemple
publi l a s s Test1 implements Runnable {
Override
p u b l i v o i d run (){
System . out. println (" Bonjour SMI6 " );
}}

Exemple
publi stati v o i d main ( String [℄ args ){
Test1 p=new Test1 ();
ThreadGroup monThreadGroup = new ThreadGroup(" Mon groupe de threads " );
Thread t = new Thread ( monThreadGroup , p );
System . out . println (" groupe :"+ t. getThreadGroup(). getName ());
t. start ();
}
Chakir LOQMAN FSDM Fès
Introdu tion
Thread en Java
Serveur multithreadé
Exer i e 1

Exer i e 1
E rire un programme ave deux threads, qui orrespondent ha un à un
ompteur. L'un des ompteurs in rémentera une valeur initiale (init) d'un
in rément (in ) positif, et e pour un nombre d'itérations donné (Nit). Ce
thread sera interrompu de  x  temps entre haque deux itérations. Pareil
pour le deuxième ompteur, mais ave un in rément (in ) négatif. Le temps
d'interruption ne sera pas le même pour les deux threads. Commenter le
résultat obtenu.

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Exer i e 1
Solution
l a s s Compteur e x t e n d s Thread {
p r o t e t e d i n t ount , in , delay , Nit ;
p u b l i Compteur ( i n t init , i n t in , i n t delay , i n t Nit ){
t h i s . ount = init ;
t h i s . in = in ;
t h i s . delay = delay ;
t h i s . Nit = Nit ;
}
p u b l i v o i d run (){
t r y { f o r ( i n t i =0; (i < Nit ); i ++){
System . out . println ( ount + " " );
ount += in ;
sleep ( delay ); }
} at h ( InterruptedEx eption e ){}
}}

Solution
publi l a s s Test {
publi stati v o i d main ( String [℄ args ) {
new Compteur (0 ,1 ,30 ,10).start ();
new Compteur (0 , -1 ,100 ,10).start ();
} }
Chakir LOQMAN FSDM Fès
Introdu tion
Thread en Java
Serveur multithreadé
Serveur multithreadé

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Serveur multithreadé

Les threads pour notre serveur


Quelques règles de base :
On va réer une lasse implémentant Runnable dont la méthode run()
prendra en harge la ommuni ation
À ette lasse on asso iera une so ket, pour ela il sut de la passer au
onstru teur
publi Servi e(So ket s)
Ainsi la méthode run() aura a ès à ette so ket
Après un a ept
On ré upère la so ket
On rée un nouvel objet implémentant Runnable
On démarre le thread orrespondant

À la n de run(), on oublie pas de fermer la so ket orrespondante

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Serveur multithreadé

Serveur multithreadé
// le servi e
l a s s Servi e implements Runnable {
p r i v a t e So ket maSo ket ;
Servi e ( So ket s) {
maSo ket = s;
}
v o i d run () {
!
// bla bla bla bla ?
!
maSo ket . lose ();
}
}

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé
Serveur multithreadé

ServerSo ket
// squelette de serveur
ServerSo ket so ketAttente;
so ketAttente = new ServerSo ket( PORT );
do {
// établissement d ' une onnexion
So ket s = so ketAttente. a ept ();

// la ommuni ation est désormais possible , réation du servi e


Thread t = new Thread (new Servi e (s ));

// on démarre l ' exé ution on urrente du servi e


t. start ();

} w h i l e ( t r u e );
so ketAttente. lose ();

Chakir LOQMAN FSDM Fès


Introdu tion
Thread en Java
Serveur multithreadé

FIN

Chakir LOQMAN FSDM Fès

Vous aimerez peut-être aussi