Ich bin neu zu Multithreading, und erfahren Sie über die Funktionalität von warten, benachrichtigen und notifyAll. Ich möchte drei Threads nacheinander ausführen und Alphabete von A bis Z drucken. Ich habe unten Code versucht und es funktioniert auch, aber ich bezweifle, ob dies der bestmögliche Weg ist, um das Problem anzugehen. Gibt es einen anderen Weg, ich kann es einfacher und besser machen? Es scheint, dass sich ein Teil meines Codes wiederholt.Wie schreibe ich unter Multithread-Programm besten Weg
package demo.threading;
class Flags {
boolean flagA = true;
boolean flagB = false;
boolean flagC = false;
}
class Container {
Flags flags = new Flags();
int charVal = (int) 'A';
void producer1() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagA)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagA = false;
flags.flagB = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void producer2() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagB)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagB = false;
flags.flagC = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void producer3() {
try {
while (charVal <= (int) 'Z') {
synchronized (this) {
if (!flags.flagC)
wait();
else {
System.out.println(Thread.currentThread().getName() + " Produced : " + (char) charVal);
flags.flagC = false;
flags.flagA = true;
charVal++;
notifyAll();
Thread.sleep(1000);
}
}
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
Container container = new Container();
Thread t1 = new Thread(() -> container.producer1(), "Thread 1");
Thread t2 = new Thread(() -> container.producer2(), "Thread 2");
Thread t3 = new Thread(() -> container.producer3(), "Thread 3");
t1.start();
t2.start();
t3.start();
}
}
Ausgang sollte sein:
Thread 1 Produced : A
Thread 2 Produced : B
Thread 3 Produced : C
Thread 1 Produced : D
Thread 2 Produced : E
Thread 3 Produced : F
Der beste Weg, das Alphabet dreimal 'System.out.println (" ABC ... XYZABC zu drucken. ..XYZABC ... XYZ ")"; oder welche Reihenfolge auch immer du erreichen willst. Das Problem beim Versuch, Multithreading aus solchen Beispielen zu lernen, ist, dass sie einfach kein Multithreading benötigen. –
Außerhalb der Tatsache, dass dieses Beispiel etwas sinnlos ist: 'wait' sollte in einer Schleife verwendet werden - **" Wie in der Einargumentversion sind Interrupts und unechte Wakeups möglich, und diese Methode sollte immer in einer Schleife verwendet werden "* * aus [JavaDoc] (https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--) Ihr catch-Block würde einfach den Thread beenden und somit keinen a behandeln Falsch Interrupt korrekt. – Fildor
@Fildor, Hallo, Vielen Dank für Ihr Feedback, können Sie bitte vorschlagen, jede vernünftige Möglichkeit, das gleiche zu erreichen :) –