Ich habe eine Methode, die von einem run() aufgerufen wird Threads übergeben. Ich mache einen Iterator für die Berechnung, wie viele Threads übergeben werden, und dies für Warte als Bedingung verwenden()notifyAll wacht nicht Thread
Ich habe den folgenden Code, die von den Threads ausgeführt wird ausgeführt()
public void testMethod(Object x) throws InterruptedException {
synchronized (x) {
while(threadsWaiting <= 5) {
threadsWaiting++;
System.out.println(x.getName() + " waiting " +
" | Threads waiting: " + threadsWaiting);
x.wait();
}
x.notifyAll();
System.out.println(x.getName() + " passed " +
" | Threads waiting: " + threadsWaiting);
}
}
Beispiel Ausgabe:
Thread 0 is created
Thread 1 is created
Thread 2 is created
Thread 3 is created
Thread 4 is created
Thread 5 is created
Thread 6 is created
Thread 7 is created
Thread 8 is created
Thread 9 is created
Thread 10 is created
Thread 11 is created
Thread 12 is created
Thread 13 is created
Thread 14 is created
Thread 15 is created
Thread 16 is created
Thread 17 is created
Thread 18 is created
Thread 19 is created
Thread 20 is created
Thread 16 waiting | Threads waiting: 1
Thread 9 waiting | Threads waiting: 2
Thread 5 waiting | Threads waiting: 3
Thread 14 waiting | Threads waiting: 4
Thread 0 waiting | Threads waiting: 5
Thread 13 waiting | Threads waiting: 6
Thread 15 passed | Threads waiting: 6
Thread 10 passed | Threads waiting: 6
Thread 4 passed | Threads waiting: 6
Thread 12 passed | Threads waiting: 6
Thread 1 passed | Threads waiting: 6
Thread 20 passed | Threads waiting: 6
Thread 11 passed | Threads waiting: 6
Thread 18 passed | Threads waiting: 6
Thread 3 passed | Threads waiting: 6
Thread 2 passed | Threads waiting: 6
Thread 17 passed | Threads waiting: 6
Thread 8 passed | Threads waiting: 6
Thread 6 passed | Threads waiting: 6
Thread 19 passed | Threads waiting: 6
Thread 7 passed | Threads waiting: 6
Wie Sie alle Fäden sehen können, die nicht passieren warten.
Dies funktioniert nur auf folgende Weise: Ich übergebe 10 x Objekte. 5 von ihnen gehen zu warten(), die anderen 5 drucken. Nach dem Drucken wird x.notifyAll() aufgerufen, aber nicht mehr 'Finished' wird gedruckt.
Warum sind sie im Leerlauf, nachdem ich notifyAll() aufgerufen habe? Ich weiß, dass sie frei sind, weil Finished nur 5 Mal gedruckt wird, auch nachdem ich notifyAll() aufrufen
Kann das Problem nicht reproduzieren. Ich bekomme 5 'Waiting' und 10' Finished' in meiner IDE und in [ideone] (http://ideone.com/ODvI0w). – Nier
Ist Ihr x alle ** Instanzen ** in jedem Thread? Weil, wenn ich mein x von statisch zu nicht-statisch ändere, bekomme ich 5 'Waiting' und 5' Finished', wie du in deiner Frage erwähnt hast. – Nier
@Nier Ja, sie sind alle verschiedene Instanzen in jedem Thread, wie ich es übergeben wie 'ClassName.method (this);' innerhalb 'run()' 'method' ist die Methode, die in meiner Frage ist und' this' ist x –