# Threads & Pipes Datenaustausch zwischen Threads



## vsk (16. Nov 2009)

Hallo!

Über die Suchfunktion habe ich bereits folgendes Thema gefunden
http://www.java-forum.org/allgemeine-java-themen/55876-threads-pipes-ubergabe-objekten-moe.html

da es geschlossen ist kann ich das Thema dort leider nicht weiter führen.

So wie es scheint hat man uns die gleiche Aufgabenstellung zukommen lassen:
Ein vorhandes kleines Adressverwaltungsprogramm nach den folgenden Vorgaben um zu schreiben.
Ein Thread für die GUI bzw. Konsolenausgabe
Ein Thread für das Laden und Speichern der Daten in eine persistente Datei
Ein Thread der das Ganze kontrollliert. (?Controller Thread)
Die Daten sollen über eine Pipe ausgetauscht werden.

Mit der Pipe habe ich dank des alten Themas keine Probleme mehr. Dank ObjectOutputStream kann ich meinen ganzen "Vector-Speicher" übergeben, vorausgesetzt ich caste es auf der anderen seite der Pipe entsprechend 

```
...
try{
    PipedOutputStream pout = new PipedOutputStream(pin);
    Speichern sp = new Speichern(pin);
    sp.start();
   
			ObjectOutputStream ous = new ObjectOutputStream(pout);
			ous.writeObject(speicher); 
			ous.close();
		} catch (FileNotFoundException ex) {
			System.err.println("Es wurde keine Datei gefunden!" + ex.getMessage());
		} catch (IOException ex) {
			System.err.println("Es ist ein Problem aufgetreten! \n" + ex.getMessage());
		}
...
```

Im Moment rufe ich das aber alles noch prozedural auf, das heisst der Thread wird erst in der Methode
save() gestartet, ebenso verhält es sich mit load() umd die datne zu laden. Dafür hätte ich ja jetzt keine Threads gebraucht...
Ich habe keine Ahnung wie ich das einen dritten Thread kontrollieren lassen soll.
Noch mehr Pipes? Über die ich dann Steuerzeichen Sende?
S für speichern L für load ... das kommt mir ein wenig abenteurlich vor...


----------



## vsk (24. Nov 2009)

Wenn ich in der Main meine Streams mit einander verbinde und dann in einem Object welches einen solchen Stream nutzt close() aufrufe, muss ich die Objecte welche die Streams benutzen neu verbinden?

in der Main:

```
//meine Streams
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis=new PipedInputStream(pos);
//verknuepft
ObjectInputStream ois = new ObjectInputStream(pis);
ObjectOutputStream oos = new ObjectOutputStream(pos);
```

in einem Object, dem die Streams uebergeben wurden

```
oos.flush();
oos.close()
```

Ist der oos jetzt komplett weg?


----------



## vsk (24. Nov 2009)

Nächste Frage:

Funktioniert bei einer Klasse die Runnable implementiert der Konstruktor nicht?
Ich bekomme meine Streams nicht verbunden.
java.io.IOException: Write end dead



```
public class ViewThreadKlasse extends Observable implements Runnable {
    private ObjectOutputStream ooraus;
    private ObjectInputStream oirein;
     
    public ViewThreadKlasse(ObjectOutputStream ooraus, ObjectInputStream oirein){
        this.ooraus = ooraus;
	this.oirein = oirein;
   }
```


```
public class ModelKlasse extends Thread{
    private ObjectOutputStream ooraus;
    private ObjectInputStream oirein;
    
    public ModelKlasse(ObjectOutputStream ooraus, ObjectInputStream oirein) {
		this.ooraus = ooraus;
		this.oirein = oirein;
    }
```
Main:

```
public static void main(String[] args) throws IOException {
        PipedOutputStream vt_pos = new PipedOutputStream();
        PipedInputStream vt_pis=new PipedInputStream(vt_pos);
	PipedOutputStream mt_pos=new PipedOutputStream();
	PipedInputStream mt_pis=new PipedInputStream(mt_pos);

	ObjectOutputStream vt_oos = new ObjectOutputStream(vt_pos);
	ObjectInputStream mt_ois = new ObjectInputStream(vt_pis);
	ObjectOutputStream mt_oos = new ObjectOutputStream(mt_pos);
	ObjectInputStream vt_ois = new ObjectInputStream(mt_pis);

       ModelKlasse modelThread = new ModelKlasse(mt_oos, mt_ois);
       ViewThreadKlasse myViewThread = new ViewThreadKlasse(vt_oos, vt_ois);

       Thread s = new Thread(myViewThread);
        s.start();
        System.out.println("view "+s.getState());
        modelThread.start();
```


----------

