[Java 1.4.2] Threads und Rückgabe/Abrufbare-Werte?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Emanuelle_1982 hat geschrieben:naja... also ob start oder run - in beiden Fällen war der Thread weg...
Was heißt "weg"? Solange du Referenzen darauf hältst, kannst du auch noch drauf zugreifen.
Emanuelle_1982 hat geschrieben:Lösung: statt von der Main-Methode nach dem join die Threads abzufragen kann man auch im Thread am Ende eine Methode der Hauptklasse aufrufen, wo das Ergebnis einfach geaddet wird...
Letztlich funktionieren beide Varianten, bei deiner musst du aber aufpassen, daß nicht beide Threads genau gleichzeitig fertig werden und es dann race conditions beim Addieren der Ergebnisse gibt (Stichwort synchronized). Die Warscheinlichkeit, daß das bei so einfachen Beispielen auftritt, ist zwar nicht sehr groß, aber man sollte es ja gleich richtig lernen.
KB:knigge
Benutzeravatar
Emanuelle_1982
Mitglied
Beiträge: 535
Registriert: 06.03.2006 18:37
Wohnort: Nümbrecht & Siegen
Kontaktdaten:

Beitrag von Emanuelle_1982 »

Pyramide hat geschrieben:
Emanuelle_1982 hat geschrieben:naja... also ob start oder run - in beiden Fällen war der Thread weg...
Was heißt "weg"? Solange du Referenzen darauf hältst, kannst du auch noch drauf zugreifen.
Damit meine ich das ich mit quersumme.methode() oder quersumme.ergebnis nicht darauf zugreifen kann - es kommt zu einem Übersetzungsfehler (also schon beim compilieren)
Pyramide hat geschrieben:
Emanuelle_1982 hat geschrieben:Lösung: statt von der Main-Methode nach dem join die Threads abzufragen kann man auch im Thread am Ende eine Methode der Hauptklasse aufrufen, wo das Ergebnis einfach geaddet wird...
Letztlich funktionieren beide Varianten, bei deiner musst du aber aufpassen, daß nicht beide Threads genau gleichzeitig fertig werden und es dann race conditions beim Addieren der Ergebnisse gibt (Stichwort synchronized). Die Warscheinlichkeit, daß das bei so einfachen Beispielen auftritt, ist zwar nicht sehr groß, aber man sollte es ja gleich richtig lernen.
hmm, das werde ich mir auch mal anschauen, davon war auch nichts in der Vorlesung - sind ja jetzt auch schon bei funktionaler Programmierung anhand von SML - und die Entwurfsmuster kamen auch noch dazwischen - das rast ein wenig...

Achja, danke auch für die weitere Betreung *gg*
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Emanuelle_1982 hat geschrieben:Damit meine ich das ich mit quersumme.methode() oder quersumme.ergebnis nicht darauf zugreifen kann - es kommt zu einem Übersetzungsfehler (also schon beim compilieren)
Das liegt daran, daß du die Variablen in deinem Code nicht als Quersumme (Klassennamen schreibt man in Java groß), sondern als Thread deklariert hast. So kannst du natürlich nur auf die Methoden zugreifen, die dir Thread bietet.
KB:knigge
Benutzeravatar
Emanuelle_1982
Mitglied
Beiträge: 535
Registriert: 06.03.2006 18:37
Wohnort: Nümbrecht & Siegen
Kontaktdaten:

Beitrag von Emanuelle_1982 »

Pyramide hat geschrieben:
Emanuelle_1982 hat geschrieben:Damit meine ich das ich mit quersumme.methode() oder quersumme.ergebnis nicht darauf zugreifen kann - es kommt zu einem Übersetzungsfehler (also schon beim compilieren)
Das liegt daran, daß du die Variablen in deinem Code nicht als Quersumme (Klassennamen schreibt man in Java groß), sondern als Thread deklariert hast. So kannst du natürlich nur auf die Methoden zugreifen, die dir Thread bietet.
Das verstehe ich jetzt gerade nicht...
OK, die Klasse groß - stimmt

und ich hatte in dem Thread eine Methode public int getErgebnis() { return this.ergebnis; }
nur konnte ich sie aus der Main-Methode der Hauptklasse nicht aufrufen

also quersumme.run() [/bzw .start()] klappt, dann kamen die joins und anschliessend versuchte ich mit int tmpErgebnis = quersumme.getErgebnis(); drauf zuzugreifen ...
das wollte der Compiler nicht kompilieren
die Zeile war mit den joins im try/Catch-Block
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Emanuelle_1982 hat geschrieben:und anschliessend versuchte ich mit int tmpErgebnis = quersumme.getErgebnis(); drauf zuzugreifen ...
das wollte der Compiler nicht kompilieren
Wenn du dem Compiler weiter oben sagst, daß quersumme1 ein Objekt vom Typ Thread ist, dann sucht er die Methode getErgebnis() natürlich auch nur dort.
KB:knigge
Benutzeravatar
Emanuelle_1982
Mitglied
Beiträge: 535
Registriert: 06.03.2006 18:37
Wohnort: Nümbrecht & Siegen
Kontaktdaten:

Beitrag von Emanuelle_1982 »

Pyramide hat geschrieben:
Emanuelle_1982 hat geschrieben:und anschliessend versuchte ich mit int tmpErgebnis = quersumme.getErgebnis(); drauf zuzugreifen ...
das wollte der Compiler nicht kompilieren
Wenn du dem Compiler weiter oben sagst, daß quersumme1 ein Objekt vom Typ Thread ist, dann sucht er die Methode getErgebnis() natürlich auch nur dort.
sorry... das oben kannst du alles um die 1 erweitern...

es war so wie ich sonst auch auf die Methoden anderer Klassen zugreife... deswegen war ich auch so irritiert und die getErgebnis war eine Methode der Klasse quersumme extends Thread
der Aufruf in der main Methode

Tippfehler sind auch unwarscheinlich, weil der Variablenname mithilfe von Alt + / in eclipse vervollständigt wurde, bei der Eingabe von dem . wurde aber die getErgebnisse wurde dort schon nicht aufgeführt. Die public Variable der Thread/quersumme'n Klasse auch nicht...
"quersumme1.ergebnis cannot be resolved or is not a field."
Als QuickFix kann ich 3 Konstanten da angeben
wenn ich stattdessen die public Methode aufgerufen hätte wäre das gleiche passiert, nur das dort halt die Methoden aufgeführt worden wären...

Aber nu gehe ich ins Bett - genug Wäsche für heute... morgen ist auch ein Tag *gg*
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Das hat nichts mit der 1, Groß/Kleinschreibung oder Methode vs. Feld zu tun. Als Denkansatz: Wenn du ein "Lebensmittel" kaufst, kannst du ja das ja auch nicht blind schälen, weil es ja auch ein Brot sein könnte - du musst schon explizit einen Apfel kaufen.

Ich würde sagen lies dich nochmal in Klassen, Subklassen und Variablentypen ein. Ich könnte es dir natürlich jetzt vorkauen und sagen, was du wo ändern musst, aber wenn man selbst merkt, warum es nicht geht, ist i.d.R. der Lerneffekt größer. Zumal sowas zu den Grundlagen gehört.
KB:knigge
Benutzeravatar
Emanuelle_1982
Mitglied
Beiträge: 535
Registriert: 06.03.2006 18:37
Wohnort: Nümbrecht & Siegen
Kontaktdaten:

Beitrag von Emanuelle_1982 »

Pyramide hat geschrieben:Das hat nichts mit der 1, Groß/Kleinschreibung oder Methode vs. Feld zu tun. Als Denkansatz: Wenn du ein "Lebensmittel" kaufst, kannst du ja das ja auch nicht blind schälen, weil es ja auch ein Brot sein könnte - du musst schon explizit einen Apfel kaufen.

Ich würde sagen lies dich nochmal in Klassen, Subklassen und Variablentypen ein. Ich könnte es dir natürlich jetzt vorkauen und sagen, was du wo ändern musst, aber wenn man selbst merkt, warum es nicht geht, ist i.d.R. der Lerneffekt größer. Zumal sowas zu den Grundlagen gehört.
Danke nochmals...
casten...

allerdings werde ich mich damit echt noch mal auseinandersetzen müssen - bisher klappte es ohne [Ausnahme: der RückgabeTyp war ein selbst erstelltes Objekt einer eigenen Klasse]
da ich als Rückgabe hier einen int habe ... naja... aber das zeigt halt das da irgendwo eine nette Ecke fehlt *gg*

Also nochmals danke, der Aufruf aus der main-Methode klappt nun auch und ich werde mich damit nochmal auseinandersetzen

MfG
Emma
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Emanuelle_1982 hat geschrieben:casten...
...ist in diesem Falle nicht nötig
KB:knigge
Benutzeravatar
Emanuelle_1982
Mitglied
Beiträge: 535
Registriert: 06.03.2006 18:37
Wohnort: Nümbrecht & Siegen
Kontaktdaten:

Beitrag von Emanuelle_1982 »

lang lang ist es her...
aber das Semester ist nun im Grunde zu Ende und die Zeit für private Vergnügen nimmt zu

Der Fehler steckte beim erstellen des Objekts...

Klasse1 variable = new Klasse2;
nicht allzu geschickt... gebe ich zu

Nochmals vielen, vielen Dank...
scheint so als hätte ich den Abstand mal dringend nötig gehabt

Emma
Antworten

Zurück zu „Coding & Technik“