Ziel: Erstellen von zwei Threads, sodass Producer- und Consumer-Threads austauschbar funktionieren, d. H. Wenn der erste Thread als Producer fungiert und der zweite als Consumer und umgekehrt.Austauschbare Rolle von Producer-Consumer-Threads in Java Multithreaded Programm
Details: Sie kommunizieren miteinander über einen Puffer, Speichern einer Ganzzahlgröße. Wenn zum Beispiel der erste Thread 1 erzeugt, dann verbraucht der zweite Thread ihn und erzeugt 2 und dann verbraucht der erste Thread 2 und erzeugt die nächsten drei ganzen Zahlen und der Verbraucher verbraucht sie nacheinander. Beide Threads beenden danach. Auch beide Threads sollten in der Lage sein, die Kommunikation zu initiieren.
Ich habe versucht, den folgenden Code zu schreiben.
import java.util.Random;
class CommonItem {
boolean flag = false;
int arr[];
public synchronized void Send(String msg) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
flag = true;
notify();
}
public synchronized void Receive(String msg) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
arr = send_random();
for (int item: arr) {
System.out.println(item);
}
flag = false;
notify();
}
synchronized int[] send_random(){
int[] arr = new int[3];
Random random= new Random();
for (int i = 0; i < 3; i++) {
arr[i]=random.nextInt(100);
}
return arr;
}
}
class T1 implements Runnable {
CommonItem Ci;
public T1(CommonItem Ci) {
this.Ci = Ci;
new Thread(this, "producer").start();
}
public void run() {
while (true)
Ci.Send("sent :1");
}
}
class T2 implements Runnable {
CommonItem Ci;
public T2(CommonItem m2) {
this.Ci = m2;
new Thread(this, "Consumer").start();
}
public void run() {
while (true)
Ci.Receive("received :2");
}
}
public class TestClass {
public static void main(String[] args) {
CommonItem m = new CommonItem();
new T1(m);
new T2(m);
}
}
Die erwartete Ausgabe ist
sent :1
received :1
sent :2
received :2
sent :57 4 13
received :57 4 13
aber ich bekomme die folgende Ausgabe OUTPUT
sent :1
received :2
57
4
13
Bitte vorschlagen, wenn eine Korrektur im Code oder eine Idee, wie man Lösen Sie das gegebene Problem auf eine andere Weise. Vielen Dank im Voraus.
Wie Sie verwenden Warte falsch ist. Siehe das Orakel-Tutorial, außerdem habe ich mehrere SO-Antworten dazu. Es ist auch keine gute Idee, den Sperrcode in die Aufgaben zu setzen, anstatt ihn in die gemeinsame Datenstruktur zu setzen. Du hast etwas genommen, das einfach und komplex sein sollte. Auch das Nichtbeachten von Code-Konventionen ist nicht gut. –