Simulation du problème classique producteur-consommateur. Ce programme simule le cas le plus simple : la mise en mémoire tampon unique. Afin de simuler la situation réelle, un délai est ajouté lors de la consommation et de la production de l'article. Vous pouvez simuler différents taux de génération et de consommation en modifiant le délai.
[code]
[/co/**
* Problème consommateur-producteur à tampon unique.
* par Xu([email protected]).
* */
classe publique ConsommateurProducer {
Tampon d'objet statique = null ;
objet statique mutex = new Object();
Objet statique condConsumer = new Object();
Objet statique condProducer = new Object();
public static void main (String[] arguments) {
Producteur de thread = new Thread() {
public void run() {
//pour(int i=0; i<10; i++) {
pour(int i=0; ; i++) {
// produit l'article.
essayer {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Élément de chaîne = new String("élément-" + i);
System.out.println("[producteur] produit " + élément);
// attend que le tampon soit vide.
synchronisé (condProducer) {
while(tampon != null) {
essayer {
condProducer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// met l'élément dans le tampon.
synchronisé (mutex) {
tampon = élément ;
System.out.println("[producteur] met " + item + " dans la mémoire tampon.");
}
// avertit les consommateurs.
synchronisé (condConsumer) {
condConsumer.notify();
}
}
}
} ;
Consommateur de thread = nouveau Thread() {
public void run() {
//pour(int i=0; i<10; i++) {
pour( ; ; ) {
// attend que l'article arrive.
synchronisé (condConsumer) {
while( tampon == null ) {
essayer {
condConsumer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// récupère l'élément du tampon.
Élément de chaîne = null ;
synchronisé (mutex) {
item = (Chaîne)tampon ;
tampon = nul ;
System.out.println(" [consommateur] récupère " + item + " du tampon. ");
}
// consomme l'article.
essayer {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [consommateur] consommé " + élément);
// avertir les producteurs.
synchronisé (condProducer) {
condProducer.notify();
}
}
}
} ;
consommateur.start();
producteur.start();
}
}de]