Ich bin neu in Multithreading in Java. Ich versuche, ein Programm auszuführen, das mehrere "Writer" simulieren kann, die Daten als Ausgabe schreiben würden.Aufruf wait() stoppt nicht den richtigen Thread
Ich möchte die Autoren alle an einem bestimmten Punkt zu stoppen, damit ich an sie warte(), aber es funktioniert nicht. Ich weiß, wo das Problem passiert, aber ich weiß nicht, warum es passiert.
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(nbOfWriters);
try {
// Create a list with all the writers that should run at the same time
Writer[] writers = new Writer[nbOfWriters];
for (int i = 0; i < nbOfWriters; i++) {
writers[i] = new Writer(i);
executor.execute(writers[i]);
}
/*
Expected outcome:
start every writer -> wait 3 seconds
pause every writer -> wait 3 seconds
run every writer -> wait 3 seconds
end
*/
TimeUnit.SECONDS.sleep(3);
for (Writer writer : writers) {
synchronized (writer) {
System.out.println("HERE 1");
writer.wait();
System.out.println("HERE 2");
}
}
TimeUnit.SECONDS.sleep(3);
for (Writer writer : writers) {
synchronized (writer) {
writer.notify();
}
}
Thread.sleep(3);
// End of the test
for (Writer writer : writers) writer.end();
}
catch (InterruptedException ex) {
System.out.println(ex.getMessage());
}
finally {
try {
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
}
catch (InterruptedException ex) {
ex.getMessage();
}
finally {
executor.shutdownNow();
}
}
}
Die Writer schreiben nur Zeug als Ausgabe (nicht wichtig hier). Ich habe print Anweisung "HIER 1" und "HIER 2" hinzugefügt, um zu zeigen, wo das Programm fehlschlägt. Grundsätzlich wird "HIER 2" nie erreicht.
In der Theorie, was passieren soll ist, dass ich Daten als Ausgabe für 3 Sekunden, dann nichts für 3 Sekunden geschrieben, dann wieder Daten als Ausgabe geschrieben.
Die tatsächliche Ausgabe ist: Stuff wird als Ausgabe für 3 Sekunden geschrieben. "HIER 1" gedruckt. Stuff wird weiterhin als Ausgabe angezeigt, keine Pause, kein "HIER 2" und das Programm hört nie auf.
Es scheint mir wie wait() stoppt den falschen Thread.
Sollte nicht writer.wait() Aufruf im spezifischen Writer-Thread wie andere Methoden warten? – Touniouk
@ Touniouk: welche "anderen Methoden" werden in einem anderen Thread als dem aufrufenden/aktuellen Thread ausgeführt? – Holger
@ Touniouk Nr. Java gibt Ihnen keine Möglichkeit, einen anderen Thread zu zwingen, etwas zu unternehmen. Was Sie tun würden, ist Ihre Anfrage zu diesem anderen Thread zu kommunizieren (und hoffe, dass sie es ehren). Sie könnten dies über ein Signal oder einen Teil der geteilten Daten tun, den der andere Thread zu überprüfen weiß. –