producteur - consommateur en Java multithreading
Je veux écrire le programme en utilisant le multithreading attendre et de les informer des méthodes en Java.
Ce programme a une pile (max-longueur = 5). Producteur de générer des nombre pour toujours et à le mettre dans la pile, et les consommateurs de choisir parmi la pile.
Lorsque la pile est pleine producteur doit attendre et quand la pile est vide, les consommateurs doivent attendre.
Le problème est qu'il s'exécute une seule fois, je veux dire une fois qu'il produit 5 nombre il s'arrête, mais j'ai mis exécuter des méthodes dans while(true) bloc à courir non-stop pouvoir mais il ne le fait pas.
Voici ce que j'ai essayé jusqu'à présent.
Producteur de classe:
package trail;
import java.util.Random;
import java.util.Stack;
public class Thread1 implements Runnable {
int result;
Random rand = new Random();
Stack<Integer> A = new Stack<>();
public Thread1(Stack<Integer> A) {
this.A = A;
}
public synchronized void produce()
{
while (A.size() >= 5) {
System.out.println("List is Full");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
result = rand.nextInt(10);
System.out.println(result + " produced ");
A.push(result);
System.out.println(A);
this.notify();
}
@Override
public void run() {
System.out.println("Producer get started");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
produce();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Et le consommateur:
package trail;
import java.util.Stack;
public class Thread2 implements Runnable {
Stack<Integer> A = new Stack<>();
public Thread2(Stack<Integer> A) {
this.A = A;
}
public synchronized void consume() {
while (A.isEmpty()) {
System.err.println("List is empty" + A + A.size());
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.err.println(A.pop() + " Consumed " + A);
this.notify();
}
@Override
public void run() {
System.out.println("New consumer get started");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true) {
consume();
}
}
}
et ici est la méthode principale:
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
Thread1 thread1 = new Thread1(stack);//p
Thread2 thread2 = new Thread2(stack);//c
Thread A = new Thread(thread1);
Thread B = new Thread(thread2);
Thread C = new Thread(thread2);
A.start();
B.start();
C.start();
}
veuillez remplir le code et supprimer les lignes vides et ceux avec des commentaires inutiles
prodeuce méthode dans Thread1 de classe et de consommer de la méthode dans Thread2 classe sont synchornized
Regardez: stackoverflow.com/documentation/java/121/...
OriginalL'auteur Saeed Mirzaee | 2013-08-13
Vous devez vous connecter pour publier un commentaire.
Je pense que ce sera mieux pour comprendre et faire face à la synchronisation en général, si vous essayez de séparer les trois choses qui sont actuellement mixte:
Tâche qui va faire le travail réel. Noms de classes
Thread1
&Thread2
sont trompeuses. Ils ne sont pas Thread objets, mais ils sont en fait des emplois ou des tâches de mise en œuvre de l'interface Runnable vous donnez àThread
objets.Fil objet lui-même de laquelle vous créez dans les principales
Partagé objet qui encapsule synchronisée des opérations logiques sur une file d'attente, une pile etc. Cet objet sera partagée entre les tâches. Et à l'intérieur de cet objet partagé que vous prenez soin d'ajouter/supprimer des opérations (avec synchronisation des blocs ou des méthodes synchronisées). Actuellement (comme il a été souligné déjà), la synchronisation est faite sur la tâche elle-même (c'est à dire chaque tâche attend et informe sur son propre cadenas et rien ne se passe). Lorsque vous séparez les préoccupations, c'est à dire laisser une classe faire une chose correctement, il finira par devenir clair, où est le problème.
OriginalL'auteur Alex P
Votre consommation et vous producteur sont synchronisés sur différents objets et ne pas se bloquer les uns les autres. Si cela fonctionne, j'oserais dire que c'est accidentel.
Lire sur
java.util.concurrent.BlockingQueue
etjava.util.concurrent.ArrayBlockingQueue
. Ces vous fournir plus moderne et plus simples à mettre en œuvre ce modèle.http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html
docs.oracle.com/javase/7/docs/api/java/util/concurrent/...
OriginalL'auteur Bex
Vous devez synchroniser sur la pile au lieu de le mettre au niveau de la méthode, essayez ce code.
Aussi, ne pas initalize la pile dans votre fil classes de toute façon vous êtes de passage dans le constructeur de la classe principale, donc pas besoin de cela.
Toujours essayer d'éviter de marque de la méthode, avec synchronisation des mots clés plutôt que d'essayer de mettre de la section critique de code dans le bloc synchronisé, car plus la taille de votre synchronisé zone plus il aura un impact sur les performances.
Donc, toujours mettre uniquement que le code en bloc synchronisé qui ont besoin de la sécurité des threads.
Code Du Producteur :
Code De La Consommation :
Il notfiy tous les threads en attente sur un événement en particulier , dans notre cas, ce sera lorsque le producteur thread est en attente sur la pile soit vide et de la consommation de threads en attente sur la pile pour contenir des données. - merci
Pourquoi nous utilisons une boucle while et pas si ? Toutes les raisons précises ?
OriginalL'auteur saurav
Essayez ceci:
OriginalL'auteur Sabuj Das
Vous pouvez utiliser Java est génial
java.util.concurrent
et de ses classes.Lire la suite De:
http://javawithswaranga.blogspot.in/2012/05/solving-producer-consumer-problem-in.html
http://www.javajee.com/producer-consumer-problem-in-java-using-blockingqueue
OriginalL'auteur Ankur Lathi
utilisation BlockingQueue,LinkedBlockingQueue c'était vraiment simple.
http://developer.android.com/reference/java/util/concurrent/BlockingQueue.html
OriginalL'auteur Shimon Doodkin
OriginalL'auteur geekyBird
Ont un coup d'oeil à cet exemple de code:
Notes:
Producer
et deuxConsumers
selon votre énoncé du problèmeProducer
va produire des nombres aléatoires entre 0 à 100 en boucle infinieConsumer
consomment ces numéros dans une boucle infinieProducer
etConsumer
verrou de partage libre et Thread-safe LinkedBlockingQueue qui est Thread-safe. Vous pouvez supprimer wait() et notify() méthodes si vous utilisez ces avancées simultanées des constructions.OriginalL'auteur Ravindra babu
Semble que vous avez omis quelque chose à propos de
wait()
,notify()
etsynchronized
.Voir cet exemple, il devrait vous aider.
OriginalL'auteur SeniorJD