Liene Informatique
3 e année Programmation Objet Avanée
TD Thread en Java
1 Synhronization sur terminaison ou sur moni-
teur
publi lass Compteur {
private stati int pt = 0;
publi void inrementeCpt() {
try {
Thread.sleep(1);
}
ath(InterruptedExeption e) {
System.out.println(e.getMessage());
}
pt++;
System.out.println("pt vaut "+pt);
}
}
1. ÉriredanslalasseCompteuruneméthodemainquirééuneinstanede
Compteuret lane50threads,haquethreadnefaisantqu'inrémenterle
ompteurptparappelàinrementeCpt.Quelproblèmevaapparaître?
2. Proposer une solution à e problème en utilisant la synhronisation sur
terminaisonàl'aidedelaméthodejoindelalasseThread.
3. Proposeruneautresolutionutilisantlasynhronisationsurmoniteur.
2 Semaphore
Érire une lasse Semaphore qui reproduit le omportement de la lasse
java.util.onurrent.Semaphoreenutilisant les méthodes waitet notify
de la lasse Objet. La lasse devra orir un onstruteur Semaphore(int
permisInitiaux),une méthode bloquante aquire(int permis) et une mé-
thoderelease(int permis).
3 Tri parallélisé
Le but de l'exerie est d'étudier la parallélisation du tri fusion. On peut
supposerqu'ilexisteunefontiondefusiondedeuxsetionsd'untableau.
1. Érire une versionmulti-tâhes dutri fusion utilisant lasynhronisation
sur moniteur et les méthodes wait et notify. Chaque thread aura une
référenesursonparentpourpouvoirluinotierqu'ilaterminésontrai-
tement.
3. Érireuneversionmulti-tâhesdutrifusionutilisantlasynhronisationà
l'aidedelalasseSemaphore.
4 Interbloage
publi lass FunnyDeadLok {
private int value;
private final Objet readLok = new Objet();
private final Objet writeLok = new Objet();
publi void setValue(int value) {
synhronized(readLok) {
synhronized(writeLok) {
this.value = value;
}
}
}
publi int getValue() {
synhronized(readLok) {
return value;
}
}
publi void performs() {
Thread t = new Thread() {
publi void run() { setValue(12); }
};
synhronized(writeLok) {
t.start();
try { Thread.sleep(1000); }
ath(InterruptedExeption e) { e.printStakTrae(); }
System.out.println(getValue());
}
}
publi stati void main(String[℄ args) {
FunnyDeadLok oups = new FunnyDeadLok();
oups.performs();
}
}
Quesepasserat-ilàl'exéutiondelalasseFunnyDeadLok?Pourquoi?
NB:lamahinevirtuelleoreunoutildedétetiondesinterbloages(tapez
Crl+