PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Consumer - Producer


Shink
2005-10-14, 15:24:02
Hallo!

Hab ein Problem: Ich will eine Klasse, bei der verschiedene Threads Daten "reinstellen" dürfen sollen, die ich dann mit einem blockenden read() abhole.
Also so etwas in der Art:

public class Device {
public byte[] readLine();
public void datenReinstellen(byte[] daten);
}

Wenn jemand readLine() ausführt, soll gewartet werden, bis jemand anderer datenReinstellen() aufruft und dann soll das geschriebene zurückgegeben werden.

Meine Lösungsansätze:
- Warten mit wait() und notify(): Darf ich nicht, da mir der Monitor nicht gehört???
- PipedInputStream/PipedOutputStream: Liefert "Broken Pipe", wenn ich mit mehreren Threads (nicht gleichzeitig) reinschreib.

Weitere Vorschläge? (Das kann doch wohl nicht so schwer sein...)

oliver123
2005-10-14, 16:56:30
Hallo!

Hab ein Problem: Ich will eine Klasse, bei der verschiedene Threads Daten "reinstellen" dürfen sollen, die ich dann mit einem blockenden read() abhole.
Also so etwas in der Art:

public class Device {
public byte[] readLine();
public void datenReinstellen(byte[] daten);
}

Wenn jemand readLine() ausführt, soll gewartet werden, bis jemand anderer datenReinstellen() aufruft und dann soll das geschriebene zurückgegeben werden.

Meine Lösungsansätze:
- Warten mit wait() und notify(): Darf ich nicht, da mir der Monitor nicht gehört???
- PipedInputStream/PipedOutputStream: Liefert "Broken Pipe", wenn ich mit mehreren Threads (nicht gleichzeitig) reinschreib.

Weitere Vorschläge? (Das kann doch wohl nicht so schwer sein...)


Ja hast Du denn einen Monitor? Poste ggf. mal deinen Code.
Sind die PipedOutput und InputStreams ThreadSafe?

HellHorse
2005-10-14, 18:37:52
BlockingQueue (http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html)

Shink
2005-10-15, 10:38:26
Ja hast Du denn einen Monitor? Poste ggf. mal deinen Code.
Sind die PipedOutput und InputStreams ThreadSafe?
OK, Code hab ich grad nicht zur Hand (Wochenende), werd ich aber nachliefern.
Monitor hätt ich eigentlich (mit synchronized (object) {}, denn wenn ich die beiden Methoden in der Deklaration synchronisiere, kann ich ja nicht schreiben, während ich blockierend lese, oder?)
PipedStreams: Sind eigentlich definitionsgemäß Threadsafe (Was soll man denn sonst damit machen? Wenn ein read() blockt, kann man mit dem selben Thread ja nix reinschreiben). Allerdings hab ich wo gelesen, dass sie eben nicht dafür gedacht sind, dass mehr als zwei Threads miteinander kommunizieren. War mal ein Bug Request, aber Sun hat nicht zugestimmt. (Naja, wenn das wirklich mit Pipes implementiert ist, ist das wenig überraschend).

@Hellhorse: Hört sich gut an, aber leider bin ich auf Java 1.4 beschränkt.

HellHorse
2005-10-15, 11:54:41
@Hellhorse: Hört sich gut an, aber leider bin ich auf Java 1.4 beschränkt.
Kein Problem, es gibt einen backport (http://www.mathcs.emory.edu/dcl/util/backport-util-concurrent/).

Alternativ kannst du auch einen Channel aus dem originalen util concurrent (http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html) nehmen, davon würde ich aber eher abraten (erschwert Migration).

Shink
2005-10-17, 10:54:14
Danke, funktioniert einwandfrei.

Nicht schlecht das Package, werd dann auch mal den ThreadPool ausprobieren.

Shink
2005-11-29, 12:34:18
Gibt es so etwas auch für .NET oder wie würdet ihr das in c# lösen?

Shink
2005-11-29, 12:36:58
OK, hab grad etwas gefunden, mal schauen ob das etwas taugt:
http://www.codeproject.com/csharp/BoundedBlockingQueue.asp