implementieren Sie-Ihre-eigenen-blocking queue in java

Ich weiß, diese Frage wurde gestellt und beantwortet viele Male zuvor, aber ich konnte einfach nicht herausfinden, einen trick auf die Beispiele rund um das internet, wie diese oder dass ein.

Beide Lösungen prüfen, für die leere der blockierenden Warteschlange array/queue/linkedlist zu notifyAll wartenden threads in put() - Methode und vice versa im get() Methoden. Ein Kommentar in das zweite Glied betont in dieser situation und erwähnt, dass das nicht notwendig.

Also die Frage ist; auch scheint Es ein wenig seltsam für mich, zu überprüfen, ob die Warteschlange leer | voll benachrichtigt alle wartenden threads. Irgendwelche Ideen?

Vielen Dank im Voraus.

  • Teil der Ausstellung bezieht sich auf die Schwierigkeit, mit wait und notify richtig in concurrent Programmen; Zitat von Joshua Bloch, Sie sind wie "low-level (Assembler) des concurrent programming." Er plädiert für die Verwendung notifyAll und dass wartende threads sollten immer eine Prüfung innerhalb einer Schleife, wenn benachrichtigt, so dass Sie halten können warten als nötig. Wirklich, man sollte Sie einfach nicht verwenden Sie wait/notify, und, statt immer planen zu verwenden, das höhere Niveau der konkurrierenden APIs in Java SE 5. Anstatt threads und wait/notify, design konkurrierenden apps in Bezug auf die Aufgaben und Testamentsvollstrecker.
  • yep, ich bin ganz mit Ihnen einverstanden, oldies but goodies: keine Notwendigkeit, das Rad neu zu erfinden. Aber denke, wir müssen warten und notifyAll für diesen Fall. Ich weiß, dass wait() sollte verwendet werden, innerhalb einer Schleife, alles erklärt in den javadocs (spurious wakeups) : docs.oracle.com/javase/6/docs/api/java/lang/.... Aber was der hack über, die Bedingungen für die Benachrichtigung? Das ist der Punkt, den ich nicht bekommen konnte.
  • Siehe hier - Sie verwenden ReentrantLock und Conditions,nicht wait/notify überhaupt.
  • wir sind in Bewegung aus dem Rahmen problem!!! Ich schaue für die eigentlichen Implementierungen, aber das ist wohl die naive Weise für eine selbst implementierte Warteschlange blockieren, und warum gibt es gleich - "wenn" - Bedingungen in den verschiedenen Lösungen? Nur ein copy paste? Unbewusste Codierung? 🙂
  • Ich war Lesung durch jenkov ist tutorials, und aus meinem Verständnis, die if (this.queue.size() == this.limit) { notifyAll(); } Hinzugefügt deque da, die threads wurden einreihen geht zu wait() nur bei der Größe hat das limit. Wenn einer der threads, deques das element, wenn die Größe voll ist, soll Sie informieren die wartenden threads. Korrigieren Sie mich, wenn ich falsch Liege 🙂
InformationsquelleAutor tugcem | 2013-11-21
Schreibe einen Kommentar