[Java] Sinn von Threads in diesem Fall

04/05/2014 17:52 Warnuk3r#1
Hey... ich arbeite zum ersten mal mit Threads. Arbeite grade an einer Personenverwaltung, sprich einem Programm, dass Daten von Personen aufnimmt und in einer Datei speichert.

Dazu habe ich hier zwei Anweisungen:

1. Ein Thread kümmert sich um die Kommunikation mit dem User.

2. Ein zweiter Thread kümmert sich um die Lese- und Schreibvorgänge.

Was macht der erste Thread also? Geht es dabei nur um die Eingabe des Nutzers im gesamten Programm? Ich habe im Vorfeld die Aufgabe ohne Threads lösen sollen und für so Sachen wie die Datenerfassung einfach eine Funktion gehabt.

Soll ich jetzt also einfach die Funktionen in die Klassen (also die Threads) einfach rein packen und das wars? So im Sinne von ErsterThread.personaufnehmen() um es aufzuführen? Ich weiß nicht, ob ich das richtig verstehe... an Sich kriege ich das hin ich will nur wissen ob ich das richtig verstehe, dass die Funktionen einfach da rein sollen und das wars.

Der zweite übernimmt dann die Funktionen des Schreibens und Lesens in/aus der Datei... das kapier ich dann schon.


Und dann benutz ich PipeWriter um mit dem Thread der mit dem User kommuniziert über den PipeReader dann mit dem anderen Thread die Daten zu übermitteln und zu sichern oder? Beim laden müsste ich das ganze dann aber umdrehen oder?
04/05/2014 21:30 Mostey#2
Quote:
Originally Posted by Warnuk3r View Post
Soll ich jetzt also einfach die Funktionen in die Klassen (also die Threads) einfach rein packen und das wars? So im Sinne von ErsterThread.personaufnehmen() um es aufzuführen?
Du verwechselst Threads mit Klassen, das sind 2 verschiedene Paar Schuhe.

Threads kann man nutzen, um gewisse Funktionen und Prozeduren auszulagern, ohne das der Hauptthread beeinflusst wird. Hast du nämlich eine GUI in deinem Programm und eine Funktion die sehr viele Daten in eine Textdatei schreibt, möchtest du ja nicht, das deine GUI nicht mehr reagiert, wenn die Daten geschrieben werden. Deshalb würde man in diesem Fall einen Thread nutzen. Dieser läuft dann im Hintergrund weiter (und beendet sich dann selber wenn er fertig ist - wobei ich mir da nicht sicher bin, ob das in jeder Sprache so ist).

Spezifische Beispiele zu Java kann ich dir leider nicht geben, da ich mit Java bisher noch nichts gemacht habe. Du wirst aber sicherlich auch so genug dazu finden. :cool:
04/05/2014 23:21 Warnuk3r#3
Quote:
Originally Posted by Mostey View Post
Du verwechselst Threads mit Klassen, das sind 2 verschiedene Paar Schuhe.

Threads kann man nutzen, um gewisse Funktionen und Prozeduren auszulagern, ohne das der Hauptthread beeinflusst wird. Hast du nämlich eine GUI in deinem Programm und eine Funktion die sehr viele Daten in eine Textdatei schreibt, möchtest du ja nicht, das deine GUI nicht mehr reagiert, wenn die Daten geschrieben werden. Deshalb würde man in diesem Fall einen Thread nutzen. Dieser läuft dann im Hintergrund weiter (und beendet sich dann selber wenn er fertig ist - wobei ich mir da nicht sicher bin, ob das in jeder Sprache so ist).

Spezifische Beispiele zu Java kann ich dir leider nicht geben, da ich mit Java bisher noch nichts gemacht habe. Du wirst aber sicherlich auch so genug dazu finden. :cool:
Ja aber Threads sind ja "Class balbla extends Threads" oder Runnable oder sonst was also sind Threads doch im Endeffekt dann diese Klassen? Deswegen habe ich es jetzt mal Klasse genannt :D
04/05/2014 23:57 Mostey#4
Quote:
Originally Posted by Warnuk3r View Post
Ja aber Threads sind ja "Class balbla extends Threads" oder Runnable oder sonst was also sind Threads doch im Endeffekt dann diese Klassen? Deswegen habe ich es jetzt mal Klasse genannt :D
Da liegst du sicher nicht ganz falsch. Threads sind zwar Klassen, man implementiert dort aber keine Funktionen. Man nutzt eine Instanz dieser Klasse um eine Funktion auszuführen.

Sieht in C# folgendermaßen aus:

Code:
 
Thread t = new Thread(ThreadStart(somefunc));
t.Start();

public void somefunc()
{
    throw NotImplementedException;
}
Nachdem das Ende von somefunc() erreicht wird, beendet sich in diesem Fall auch der Thread. Vielleicht wird dir ja jetzt klar, warum man das so nutzt.
04/06/2014 00:00 Warnuk3r#5
Achso das heißt dass in einen Thread beziehungsweise die Klasse an sich keine Funktion rein kommt, außer die Run?

Das erklärt mir dann gleich alles vielen dank! Dachte da typisch an eine Klasse mit Funktionen dabei. So ergibt das ganze auch Sinn.
04/06/2014 14:15 XxharCs#6
Ich hatte eine ähnliche Aufgabe in der Schule, eine "Roboter-Fabrik" zu erstellen. :p


Beim Punkt 1 wie du schon sagst, die Ein-und Ausgaben verwalten, wie schon richtig steht Kommunikation, und solange das passiert sollst du in eine Datei schreiben bzw. lesen.

Ich gehe davon aus dass das Programm solange läuft bis der Benutzer das Programm beendet, deswegen brauchst du Watchdogs für deine Threads, um einen Thread sicher zu beenden und sicher zu schließen.
04/07/2014 16:57 MrSm!th#7
Quote:
Originally Posted by Mostey View Post
Da liegst du sicher nicht ganz falsch. Threads sind zwar Klassen, man implementiert dort aber keine Funktionen. Man nutzt eine Instanz dieser Klasse um eine Funktion auszuführen.

Sieht in C# folgendermaßen aus:

Code:
 
Thread t = new Thread(ThreadStart(somefunc));
t.Start();

public void somefunc()
{
    throw NotImplementedException;
}
Nachdem das Ende von somefunc() erreicht wird, beendet sich in diesem Fall auch der Thread. Vielleicht wird dir ja jetzt klar, warum man das so nutzt.
Falsch, in Java leitet man von Thread ab und implementiert die run Methode. Diese wird aufgerufen, wenn der Thread gestartet wird.

Um noch ein bisschen klugzuscheißen: Die Klasse ist nur der Bauplan für den Thread. Der Thread ist ein Objekt.
Quote:
Originally Posted by Warnuk3r View Post
Achso das heißt dass in einen Thread beziehungsweise die Klasse an sich keine Funktion rein kommt, außer die Run?

Das erklärt mir dann gleich alles vielen dank! Dachte da typisch an eine Klasse mit Funktionen dabei. So ergibt das ganze auch Sinn.
Doch, du kannst du viele Methoden schreiben wie du willst (du solltest es sogar; sonst wird die run Methode sehr unübersichtlich).
Was du suchst, ist threadübergreifende Kommunikation. Such einfach mal nach synchronized java.
Du kannst durchaus getter und setter threadsafe machen und so dem Thread Daten übergeben.
04/07/2014 20:32 dowhile#8
[Only registered and activated users can see links. Click Here To Register...] könnte für dich auch nützliche Klassen enthalten.
04/11/2014 19:31 Warnuk3r#9
Habs jetzt hinbekommen danke an alle.