Probleme bei Rückgabewert

Status
Nicht offen für weitere Antworten.

ulr!ch

Bekanntes Mitglied
Hi JavaGemeinde,

ich habe eine externe Klasse namens Trial, die ungefähr (reduziert) so aus sieht:

Code:
import javax.swing.*;

public class Trial
    extends Thread {
  int sound_time, trial_case;
// [...] 

  public Trial(/*[... Importe ...]*/) {
// Übergabe der Importe
  }

  public void run() {
    Thread thread_trial = new Thread(this);

// verschiedene Berechnungen, Bestimmen des trial_case über if-Anweisungen aus den Importen
switch (trial_case) {
      case 1:
	sound_time = 3500;
	break;
      case 2:
	sound_time = 4180;
	break;
      case 3:
	sound_time = 3656;
	break;
      case 4:
	sound_time = 4164;
	break;
    }

// Thread beendet sich selbst
    thread_trial.interrupted();
  }

// Die Methode trialDauer gibt die Dauer der akustischen Rückmeldung wieder
  public int trialDauer() {
    return(sound_time);
  }
}

Wieso bekomme ich mit dem Methodenaufruf:
Code:
int abc = new Trial(/* ...Importe... */).trialDauer();
keinen Rückgabewert bzw. ist dieser Null?
Womit hat das was zu tun:
a) mit den if-Anweisungen?
b) mit dem Thread?

Steh' auf dem Schlauch und bin für Lösungsvorschläge wirklich dankbar!

By<e Ulrich
 

bambi

Bekanntes Mitglied
Hab' gerade gesehen, dass Du in Deinem switch-case gar kein default hast. Das wuerde ich an Deiner Stelle aber schon
einbauen - gerade eben um Fehler zu finden ist das ganz nuetzlich... :wink:
 

Wildcard

Top Contributor
Das sind KEINE Importe sonder Parameter :shock:
Code:
  public Trial(/*[... Importe ...]*/) { 
// Übergabe der Importe 
  }
Wenn dein Konstruktor wirklich so aussieht, dann wird der Thread nie gestartet, insofern ist trialDauer eben noch auf 0.
Das bringt sowieso nichts, da ein Thread eben nebenlaufig ist, diese direkte Wertabfrage also nur zufällig funktionieren würde.
Vermeide besser '_' das ist schlechter Stil
 

ulr!ch

Bekanntes Mitglied
bambi hat gesagt.:
Hab' gerade gesehen, dass Du in Deinem switch-case gar kein default hast. Das wuerde ich an Deiner Stelle aber schon einbauen - gerade eben um Fehler zu finden ist das ganz nuetzlich... :wink:
Steht auch drin, habe ich bloß nicht rein geschrieben. :)
Nachtrag:
Code:
default:
System.err.println( "Was soll hier passieren?" );
Zur anderen Frage: Er gibt halt '0' aus. :(
So als wenn er die Anweisungen sound_time = 123 nicht liest.

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Wenn dein Konstruktor wirklich so aussieht, dann wird der Thread nie gestartet, insofern ist trialDauer eben noch auf 0. Das bringt sowieso nichts, da ein Thread eben nebenlaufig ist, diese direkte Wertabfrage also nur zufällig funktionieren würde. Vermeide besser '_' das ist schlechter Stil
a) Wieso funktioniert folgendes nicht?
Code:
Trial trial_abc = new Trial(/* Parameter */);
trial_abc.start();
int abc = trial_abc.trialDauer();
System.out.println(abc);
b) Den zweiten Einwand verstehe ich nicht. Meinst du, zu dem Zeitpunkt, an dem ich die Abfrage starte, befindet sich der Thread noch in Bearbeitung und ist zu den Anweisungen sound_time = 123 noch gar nicht vorgedrungen?
c) Wieso_ist_das_schlechter_Stil? Kann das zu Problem führen? :)

By<e Ulrich
 

Wildcard

Top Contributor
Den zweiten Einwand verstehe ich nicht. Meinst du, zu dem Zeitpunkt, an dem ich die Abfrage starte, befindet sich der Thread noch in Bearbeitung und ist zu den Anweisungen sound_time = 123 noch gar nicht vorgedrungen?
Zunächst mal steht hier nirgends sound_time = 123; was soll ich dazu also sagen?
c) Wieso_ist_das_schlechter_Stil? Kann das zu Problem führen?
Ja! Mit Menschen die was gegen schlechten Stil haben :wink:
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Zunächst mal steht hier nirgends sound_time = 123; was soll ich dazu also sagen?
Ja! Mit Menschen die was gegen schlechten Stil haben :wink:
a) sound_time wird in der switch/ case-Anweisung festgelegt
b) Das ist ein schlagendes Argument, gegen das ich mich natürlich mit Vergnügen auflehne. 8)

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Ja, gut,
das es zufällig - je nach dem wo im Code aufgerufen - einen Rückgaebwert liefert, habe ich mittlerweile eingesehen.
Gibt es eine andere Möglichkeit? Ohne eine neue Klasse oder das aufsplitten in verschiedene? Oder ist der Tenor - kurzum - Threadklassen liefern keine Rückgaebwerte?

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Dann weißt du ja jetzt warum's nicht funktioniert!?
:bahnhof: Warum würde ich hier schreiben, wenn ich's wüsste? Um euch auf die Probe zu stellen?...
Lieber Wildcard: Meinst du vielleicht, dass es an der switch-Anweisung liegt? :?

By<e Ulrich
 

Wildcard

Top Contributor
Code:
int abc = new Trial(/* ...Importe... */).trialDauer();
Zu diesem Zeitpunkt ist nur sichergestellt das der Konstruktor beendet wurde.
Wenn du hier einen Wert zuweist müsste das auch funktionieren.
Falls du den Thread erst in der anderen Klasse startest ist es also nicht zufällig, sondern absolut sicher das du keinen Wert erhälst.
Gibt es eine andere Möglichkeit? Ohne eine neue Klasse oder das aufsplitten in verschiedene? Oder ist der Tenor - kurzum - Threadklassen liefern keine Rückgaebwerte?
Kommt immer drauf an was man haben möchte.
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Falls du den Thread erst in der anderen Klasse startest ist es also nicht zufällig, sondern absolut sicher das du keinen Wert erhälst.
So? Dann erkläre mir mal bitte das:
Code:
Trial trial_abc = new Trial(/* Parameter */);
trial_abc.start();
System.out.println(trial_abc.trialDauer());
  try {
    thread_xyz.sleep(trial_abc.trialDauer());
  }
  catch (InterruptedException ie) {
    System.out.println("IE im thread_abc");
  }
liefert 0, wohingegen:
Code:
Trial trial_abc = new Trial(/* Parameter */);
trial_abc.start();
  try {
    thread_xyz.sleep(trial_abc.trialDauer());
    System.out.println(trial_abc.trialDauer());
  }
  catch (InterruptedException ie) {
    System.out.println("IE im thread_abc");
  }
den korrekten Wert von 3656 zurückliefert.

By<e Ulrich
 

Wildcard

Top Contributor
So? Dann erkläre mir mal bitte das:
Das ist ja auch etwas völlig anderes!
Wenn du hier einen Wert verlangst, und den Thread erst später startest ist kja wohl klar das da noch kein Wert ist :D
Code:
int abc = new Trial(/* ...Importe... */).trialDauer();
In deinem 2.Beispiel kann es funktionieren, muss aber nicht. So einfach ist das :wink:
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Wenn du hier einen Wert verlangst, und den Thread erst später startest ist kja wohl klar das da noch kein Wert ist :D
mhm... ? Also in beiden Beispielen wird zuerst der Thread gestartet. Und zweitens - falls das deine Vermutung sein sollte - ist dieser Thread auch im zweiten Bsp. noch nicht durchgelaufen.
Also, wieso? Ich verstehe dich einfach nicht. Wirklich, ist ja nicht böse gemeint.

By<e Ulrich
 

Wildcard

Top Contributor
ulrich.schroeders hat gesagt.:
Wildcard hat gesagt.:
Wenn du hier einen Wert verlangst, und den Thread erst später startest ist kja wohl klar das da noch kein Wert ist
mhm... ? Also in beiden Beispielen wird zuerst der Thread gestartet. Und zweitens - falls das deine Vermutung sein sollte - ist dieser Thread auch im zweiten Bsp. noch nicht durchgelaufen.
Also, wieso? Ich verstehe dich einfach nicht. Wirklich, ist ja nicht böse gemeint.
Das bezieht sich auf den Anfang dieses Topics (wollte eigentlich Threads schreiben, aber das führt jetzt wohl ins Chaos :D )!
Wenn du diesen Aufruf machst (und der Thread sich nicht selbst im Konstruktor startet sondern von deiner Klasse gestartet wird)
Code:
int abc = new Trial(/* ...Importe... */).trialDauer();
Hat der Thread die run Methode noch gar nicht betreten wenn trialDauer() (sollte übrigens getTrialDauer() heißen :wink: ) aufgerufen wird. Folglich hast du deiner Variablen noch keinen Wert zugewiesen, und folglich bekommst du auch 0 zurück. Es wird lediglich der Konstruktor ausgeführt!
Bei deinen beiden späteren Beispielen rufst du trialDauer() erst nach dem Thread-start auf. Folglich kann man nicht vorhersagen ob der Thread oder deine Hauptklasse schneller war, also bekommst du entweder ein Ergebnis, oder keins, oder mit viel Pech einen Osterhasen zurück. Kann man eben nicht wissen :D
 

ulr!ch

Bekanntes Mitglied
Ok, danke, dass habe ich nun verstanden. :D Yeah!

Aber... rein praktisch gesehen... bin ich genau so schlau wie vorher... oder doch fast.

Wildcard hat gesagt.:
Wenn du diesen Aufruf machst (und der Thread sich nicht selbst im Konstruktor startet sondern von deiner Klasse gestartet wird)
:? Ist das nun die Lösung, dass der Thread im Konstruktor gestartet wird?
Wenn ja, wie sieht das aus, davon habe ich noch nichts gehört.

Dank vorab,
Ulrich
 

Wildcard

Top Contributor
Ist das nun die Lösung, dass der Thread im Konstruktor gestartet wird?
Auch dann lässt sich das Ergebniss nicht genau vorherbestimmen.
Kannst du mir mal beschreiben was du gerne machen möchtest, dann wird sich schon eine Lösung finden.
 

ulr!ch

Bekanntes Mitglied
Wildcard hat gesagt.:
Kannst du mir mal beschreiben was du gerne machen möchtest, dann wird sich schon eine Lösung finden.
Also diese Trial-Klasse spielt einen Sound-File der Länge sound_time ab.
In dieser Zeit soll die aufrufende Klasse schlafen.
Ich möchte (aus anderen wichtigen Gründen) nicht die beiden Klassen zusammenlegen.
Das ist eigentlich schon alles, nur das ich nicht bestimmen kann wie lange sound_time/ sleepy-time :) anhält.
Eine if-Anweisungvorzuschalten sieht ziemlich bescheuert aus und ich dachte ich könnte mir die Länge ausgeben lassen... Hast du vielleicht noch eine andere Ideee?

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Also JavaGemeinde,

ich gehöre gesteinigt und aus der Welt der Hobby-Programmierer ausgeschlossen, aber ich bekomme das mit dem wait(); und notify(); nicht hin. :(
Schaut euch doch mal bitte das an und sagt mir, was ich verkehrt mache:
Code:
public class Trial
    extends Thread {
  int sound_time, trial_case;
  public Trial(/* Parameter */) {
// Übergabe der Parameter
  }
  
  public void run() {
    Thread thread_trial = new Thread(this);
// [...]

    try {
      thread_trial.sleep(sound_time);
    }
    catch (InterruptedException ie) {
      System.out.println("IE in thread_trial");
    }

    try {
      fertig();
    }
    catch (InterruptedException ie) {}

// Thread beendet sich selbst
    thread_trial.interrupted();
  }

  public synchronized void fertig()
      throws InterruptedException
  {
    notifyAll();    
  }
}
Das sieht in IMHO schon ziemlich umständlich aus... :?

Die aufrufende Klasse besitzt folgenden Code
Code:
Trial trial_abc = new Trial(/* Parameter */);
trial_abc.start();
  try {
    thread_xyz.wait();
       }
  catch (InterruptedException e) {}

Muss hier nicht stehen, dass er solange warten soll bis... ja was eigentlich... bis halt notify... oder ist das automatisch?
Ich befürchte, ich habe da irgendetwas grunsätzliches nicht verstanden. :(

Hilfe, bitte!

By<e Ulrich
PS: Fliegt immer mit "IllegalMonitorStateException: current thread not owner" raus.
 
B

Beni

Gast
Ich hab nicht alles gelesen, aber zu wait und notifiy:

Code:
// Irgendein Objekt, welches in beiden Threads sichtbar ist.
Object object = ...

// ein erster Thread, der warten soll
public void run(){
  synchronized( object ){
    object.wait();
  }
}

// ein zweiter Thread, der den ersten starten soll
public void run(){
  synchronized( object ){
    object.notify();
  }
}

Das synchronized wird benötigt, um den Monitor zu bekommen (andernfalls gibt es diese Exception).
 
B

Beni

Gast
Ich meinte mit sichtbar, dass beide Thread dasselbe Objekt (oder dieselbe Instanz, wenn dir das mehr sagt) haben.

Also ja, müsstest du irgendwo irgendwie übergeben.
 

ulr!ch

Bekanntes Mitglied
Aber das kann doch alles gar nicht sein? :?
Ich habe eine Klasse A, die eine externe Klasse B aufruft, solange B läuft soll A schlafen.
Das kann doch gar nicht so schwer sein. Ich bin doch bestimmt nicht der erste, der so ein Problem hat.
Ich kann doch nicht den Thread übergeben, dann kann ich direkt eine Klasse draus machen.
Kann ich nicht durch isInterrupted(); den Zustand des Threads in Klasse B abfragen oder kriege den Status wegen der Nebenläufigkeit der Threads nicht?

Danke, Ulrich
 

ulr!ch

Bekanntes Mitglied
Habe das Thema geändert und unter "IsInterrupted()" neu gepostet.
Irgendwie bin ich vo notify();/ wait(); und den Rückgabewerten zu genervt.
Sorry! :(

By<e Ulrich
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T invoke() einer Methode - Probleme mit Rückgabewert Allgemeine Java-Themen 5
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
R JRE Ablaufdatum seit 7u10 - Probleme bei selbst ausgelieferter JRE bekannt? Allgemeine Java-Themen 3
H Reg Exp Probleme Allgemeine Java-Themen 5
M Classpath Probleme bei JAR Generierung Allgemeine Java-Themen 2
S Probleme mit JAVA-Installation Allgemeine Java-Themen 3
D Probleme bei for-Schleife Allgemeine Java-Themen 4
R Probleme mit Javadoc Allgemeine Java-Themen 2
G Gson Probleme Allgemeine Java-Themen 2
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
M Google App Engine macht Probleme Allgemeine Java-Themen 4
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
F 2d array probleme Allgemeine Java-Themen 2
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
T Interface Probleme Allgemeine Java-Themen 8
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
M Probleme mit String in Label übergeben. Allgemeine Java-Themen 6
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
U Probleme mit Kopiervorgang Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben