49 lines
1.5 KiB
Java
49 lines
1.5 KiB
Java
|
// v0.2, 17/9/21 (PM)
|
||
|
/* Bonus (?) : schéma producteur-consommateur
|
||
|
La classe PCA suivante est une implémentation du schéma
|
||
|
producteur/consommateur, pour un unique producteur et un unique consommateur. L'algorithme
|
||
|
semble correct, et pourtant... le test montre un comportement incorrect. Expliquez et rectifiez le code en conséquence.
|
||
|
*/
|
||
|
|
||
|
public class PCA {
|
||
|
|
||
|
static final int N = 10;
|
||
|
static int dépôt = 0;
|
||
|
static int retrait = 0;
|
||
|
static int[] tampon = new int[N];
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
Thread t1 = new Thread(new Producteur());
|
||
|
Thread t2 = new Thread(new Consommateur());
|
||
|
t1.start();
|
||
|
t2.start();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Producteur implements Runnable {
|
||
|
// dépose des suites de N entiers identiques, en incrémentant la valeur déposée à chaque nouvelle suite
|
||
|
public void run() {
|
||
|
for (;;) {
|
||
|
System.out.println("production...");
|
||
|
while (PCA.dépôt-PCA.retrait>=PCA.N) {}
|
||
|
System.out.println("PCA.dépôt "+ PCA.dépôt/PCA.N);
|
||
|
PCA.tampon[PCA.dépôt%PCA.N] = PCA.dépôt/PCA.N;
|
||
|
PCA.dépôt++;
|
||
|
System.out.println("fait");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Consommateur implements Runnable {
|
||
|
public void run() {
|
||
|
int item;
|
||
|
for (;;) {
|
||
|
System.out.println("repos...");
|
||
|
while (PCA.dépôt<=PCA.retrait) {}
|
||
|
System.out.println("PCA.retrait");
|
||
|
item=PCA.tampon[PCA.retrait%PCA.N];
|
||
|
PCA.retrait++;
|
||
|
System.out.println("consommation "+item);
|
||
|
}
|
||
|
}
|
||
|
}
|