Ich habe zwei Threads. Einer von ihnen schreibt in PipedOutputStream, ein anderer liest aus dem entsprechenden PipedInputStream. Hintergrund ist, dass ein Thread einige Daten vom Remote-Server herunterlädt und sie über Pipestreams zu mehreren anderen Threads multiplext.PipedInputStream - Wie zu vermeiden "java.io.IOException: Rohr gebrochen"
Das Problem ist, dass manchmal (vor allem, wenn das Herunterladen großer (> 50MB) Dateien) Ich java.io.IOException erhalten: Rohr gebrochen, wenn sie von PipedInputStream zu lesen versuchen.
Javadoc sagt, dass A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.
Es ist wahr, mein Schreiben Thread wirklich stirbt nach dem Schreiben aller seiner Daten zu PipedOutputStream.
Irgendwelche Lösungen? Wie kann ich verhindern, dass PipedInputStream diese Ausnahme auslöst? Ich möchte in der Lage sein, alle Daten zu lesen, die in PipedOutputStream geschrieben wurden, selbst wenn der Schreib-Thread seine Arbeit beendet hat. (Wenn jemand weiß, wie man den Thread am Leben hält, bis alle Daten gelesen sind, ist diese Lösung ebenfalls akzeptabel).
Schönes Feature, es ist definitiv +1, aber es muss eine Instanz von CountDownLatch zwischen verschiedenen Threads teilen. Das ist nicht sehr gut, weil das Schreiben und Lesen von Threads an verschiedenen Stellen erzeugt wird und ich möchte, dass sie nicht voneinander wissen. Meine Architektur ist jetzt so, dass sie nur wissen, dass sie in den gegebenen Stream schreiben/lesen sollen. – levanovd
Dann könnten Sie Piped [In | Out] putStream erweitern, um die Manipulation von CountDownLatch zu handhaben. – Jerome
oder schreiben Sie Ihren eigenen Input/OutputStream, der die Pipe und den Latch umschließt (siehe Beispielcode, den ich in meiner Antwort hinzugefügt habe) – Jerome