• Aucun résultat trouvé

TDn 1ProgrammationconcurrenteenJava Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre

N/A
N/A
Protected

Academic year: 2022

Partager "TDn 1ProgrammationconcurrenteenJava Universit´eParisDiderot–Paris7Programmationr´eseauL3InformatiqueAnne2010-2011,2 semestre"

Copied!
2
0
0

Texte intégral

(1)

Universit´ e Paris Diderot – Paris 7 Programmation r´ eseau L3 Informatique Anne 2010-2011, 2

`eme

semestre

TD n

1

Programmation concurrente en Java

Exercice 1

[Threads, attente] ´ Ecrivez une classe qui d´emarre deux threads. Le premier thread doit afficher dix fois "Bonjour !" en laissant passer une seconde entre chaque affichage. Le deuxi`eme thread doit afficher cinq fois "Salut !", en lassant passer deux secondes entre chaque affichage.

Indication : La m´ ethode statique sleep de la classe Thread permet de mettre un thread en attente.

Exercice 2

[Variable partag´ee entre threads ] On souhaite trouver toutes les oc- currences d’un ´el´ement dans un tableau donn´e. Pour cela, si le tableau est long (plus qu’une constante TAILLE MIN), on peut le couper en deux et effectuer la recherche ind´ependamment dans les deux moiti´es, en confiant la seconde partie

`

a un nouveau thread travaillant en parall`ele. ´ Ecrire un programme effectuant la recherche de cette mani`ere ; le programme devra afficher un message pour chaque occurrence trouv´ee, puis afficher le nombre total d’occurences l’´el´ement dans le ta- bleau. Pour cet exercice, vous pouvez utilisez la classe CompteurConcurrent que vous trouverez ci-dessous.

c l a s s CompteurConcurrent

{

p r i v a t e i n t cp t = 0 ;

p u b l i c i n t getValu e ( )

{

r e t u r n cp t ;

}

p u b l i c S t r i n g t o S t r i n g ( )

{

r e t u r n ””+ cp t ;

}

s y n c h r o n i z e d p u b l i c v o i d i n c r e m e n t e ( )

{

cp t ++;

}

s y n c h r o n i z e d p u b l i c v o i d i n c r e m e n t e ( i n t i )

{

cp t = cp t+i ;

} }

Exercice 3

[Synchronisation entre threads] Il s’agit ici d’impl´ementer un syst`eme de producteurs/consommateurs. Ces producteurs/consommateurs communiquent

1

(2)

par un buffer partag´e pouvant contenir une chaˆıne de caract`eres. Si le buffer est vide, un producteur a le droit de le remplir et il signale ensuite ` a tout le monde qu’il l’a rempli, au contraire si le buffer contient une chaˆıne de caract`eres (c’est-` a- dire qu’il est plein), le producteur doit attendre qu’un consommateur consomme ce qu’il y a dans le buffer. Quant au consommateur, il essaie de lire ce qu’il y a dans le buffer, si il y arrive, il vide le buffer et il signale cela ` a tout le monde, sinon il attend qu’un producteur produise une donn´ee dans le buffer.

1. Dans un premier temps, les classes Consommateur et Producteur en utilisant la classe ArrayBlockingQueue pour le buffer et testez les avec par exemple deux producteurs et deux consommateurs.

2. Dans un deuxi`eme temps, r´e´ecrivez les classes Consommateur et Producteur avec cette fois-ce une classe Buffer impl´ement´ee par vos soins.

Indication : Pour cet exercice, on utilisera les m´ ethodes wait et notifyAll de la classe Thread. Lorsque la m´ ethode wait est invoqu´ ee ` a partir d’une ethode synchronized, en mˆ eme temps que l’ex´ ecution est suspendue, le verrou pos´ e sur l’objet par lequel la m´ ethode a ´ et´ e invoqu´ ee est relˆ ach´ e. D` es que la condition de r´ eveil survient, le thread attend de pouvoir reprendre le verrou et continuer l’ex´ ecution. La m´ ethode notify eveille un seul thread.

Si plusieurs threads sont en attente, c’est celui qui a ´ et´ e suspendu le plus longtemps qui est r´ eveill´ e. Lorque plusieurs threads sont en attente et qu’on veut tous les r´ eveiller, il faut utiliser la m´ ethode notifyAll.

2

Références

Documents relatifs

Le client de notre protocole envoie au serveyr une requˆete sous forme d’un paquet UDP qui contient l’adresse IP du client ainsi que la date ` a laquelle le message est transmis...

Connectez vous ` a ce service sur la machine lucien avec la commande nc (qui fonctionne comme telnet et testez quelques requˆetes).. 2 Clients

Pour cela le client demande la d´efinition d’un mot au serveur et celui-ci lui renvoie le texte obtenu par l’appel ` a l’utilitaire dict. Si dict ne trouve pas de d´efinition,

Modi- fiez votre serveur pour que apr`es avoir v´erifi´e que le chemin de la requˆete com- mence par ”/” et ne contient pas la chaˆıne ”/../” 1 , il retourne au client le

Lancez la commande nc avec l’option -l 8080, cela ouvre un serveur sur votre machine locale sur le port 8080.. Tapez une ligne dans

Les hints prennent aussi le forme d’une structure addrinfo : vous pouvez indiquer des restrictions sur le type de socket que vous souhaitez utiliser (si vous n’avez aucune

Pour cela vous pouvez utiliser la commande telnet (usage : telnet machine service o` u service peut ˆetre soit le num´ero de service soit le nom du service)1. D´eterminez le

Ecrivez un programme Java ´ jdaytime qui se connecte au service daytime d’une machine donn´ ee en param` etre et r´ ecup` ere la date pour l’afficher ` a l’´ ecran.. Exercice