Threads synchronisieren mit Pipes

Status
Nicht offen für weitere Antworten.

furchi

Neues Mitglied
Hallo,

Seit längerem versuche ich verzweifelt zwei Threads über Pipes zu verbinden.

Der erste Thread (producer) soll dazu verwendet werden RGB Werte eines ".jpg" Bildes von einem Server zu laden.
Die RGB Daten sind als Integer Werte in einem DataOutputStream verpackt.
Der consumer Thread ist für die graphische Darstellung als BufferedImage zuständig, sollte also die Daten vom Producer weiterverarbeiten.
Um diese beiden Threads möglichst elegant zu synchronisieren, möchte ich Pipes verwenden.

Nun habe ich aber das Problem, dass die Daten beim producer zwar fehlerfrei ankommen, aber nicht vollständig über die Pipe laufen. Beim consumer Thread kommt nur ein Teil an.

hier die wesentlichen Codeteile:

BasisKlasse:
Code:
PipedOutputStream pout = new PipedOutputStream();
PipedInputStream pin = new PipedInputStream(pout); 

GetPicture prod = new GetPicture(ip, port, pout);
ShowPicture cons = new ShowPicture(pin);
			
prod.start();
cons.start();

ProducerThread:
Code:
public class GetPicture extends Thread {
	private DataOutputStream out;
	private DataInputStream in;
	private Socket socket = null;
	private String ip = "";
	private int port = 0;

	public GetPicture(String ip, int port, OutputStream out) {
		this.ip = ip;
		this.port = port;
		this.out = new DataOutputStream(out);

		try {
			socket = new Socket(ip, port);
			in = new DataInputStream(socket.getInputStream());
		} catch (Exception e) {
			System.out.println("GetPicture " + e.getMessage());
		}

	}

	public void run() {
		try {
			while (in.available() > 0) {
				out.write(in.readInt());
			}
			// in.close();
			// socket.close();
			// pout.close();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}

}

ConsumerThread:
Code:
public class ShowPicture extends Thread {
	private DataInputStream in;
	// private ImageFrame target;

	public ShowPicture(InputStream in) {
		this.in = new DataInputStream(in);
	}

	public void run() {
		// int width=0;
		// int height=0;
		int val;
		try {
			while (in.available() > 0) {
				val = in.readInt();
				System.out.println(val);
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
}

Kann das Problem vielleicht an den DataOutput/InputStreams in Verbindung mit den PipedStreams liegen?

vielen Dank im Voraus
mfg
 
B

Beni

Gast
Also wenn der Consumer schneller als der Producer ist, dürfte "in.available" plötzlich mal = 0 sein.

"available" sagt nicht wieviele Bytes insgesammt gelesen werden können! Es sagt nur, wieviele Bytes *jetzt* gerade ganz schnell gelesen werden können.
 

foobar

Top Contributor
Lass den Consumerthread doch mit wait() auf die Daten warten um ihn dann aus dem Producerthread mit notifyAll() aufzuwecken. Dann kannst du immer sicher sein, daß Daten vorhanden sind.
 

furchi

Neues Mitglied
thx für die Antworten,

Die Funktion von in.available() ist mir klar, war nur für Testzwecke vorhanden.
Warum die Piped Streams nicht richtig funktionieren ist mir immer noch ein Rätsel (wait(), notify() sind soweit ich weiß nicht notwendig, da die Pipes ja intern synchronisieren sollten).

Jedenfalls habe ich das Problem jetzt mit einer eigenen Bufferklasse gelöst.

mfg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T TCP mit und ohne Threads Netzwerkprogrammierung 1
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
K Threads/Server/telnet Fehler Netzwerkprogrammierung 2
D Exception Handling bei In/Outputsockets in eigenen Threads Netzwerkprogrammierung 1
C Frage zu Threads & Server Netzwerkprogrammierung 4
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
J Threads & Streams Netzwerkprogrammierung 9
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S HTTP ServerSockets und Threads Netzwerkprogrammierung 5
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
R Threads mit einem WebService Netzwerkprogrammierung 4
M Verständnisfrage zu RMI und Threads Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
A Threads auflisten und nacheinander ansprechen Netzwerkprogrammierung 6
C I/O - Synchronisation durch Threads in einem ChatClient Netzwerkprogrammierung 4
J Probleme mit Threads (Client terminiert) Netzwerkprogrammierung 4
P Threads einbinden Netzwerkprogrammierung 11
P RMI Callback (mit Threads?) Netzwerkprogrammierung 3
T RMI Threads und Synchronized Netzwerkprogrammierung 13
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
S Threads beim Server koordinieren Netzwerkprogrammierung 5
L ClientServer mit 2 Threads Netzwerkprogrammierung 5
N Threads und Socketprogrammierung Netzwerkprogrammierung 4
G 1 Socket 2 Threads problem Netzwerkprogrammierung 13
K Problem mit Threads Netzwerkprogrammierung 3
S Threads bei Web Service sinnvoll oder Alternative? Netzwerkprogrammierung 2
K Hintergrund - Threads Netzwerkprogrammierung 3
G Socket Programmierung - Max. Threads Netzwerkprogrammierung 5
C NetScanner arbeitet trotz Threads langsam Netzwerkprogrammierung 6
L UDP-Server mit Threads Netzwerkprogrammierung 8
K Windows 10 Threads gleichzeitig Netzwerkprogrammierung 18
C Join von Threads bei I/O-Operation Netzwerkprogrammierung 6
G benötige Beispiel für parallel ablaufende Threads Netzwerkprogrammierung 3
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
TRunKX Threads beenden sich selber? Netzwerkprogrammierung 6
T Kleiner Chatserver: Threads oder Multiplex? Netzwerkprogrammierung 18
G Gui von 2 Clients Synchronisieren Netzwerkprogrammierung 2
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
H java ftp-library zum synchronisieren Netzwerkprogrammierung 3
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
R Pipes Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben