Multithreadingproblem (IllegalThreadStateException)

Hi

Ich habe eine Klasse Record. Sie implementiert Runnable.
Ich habe eine Klasse Main. Sie implementiert einen KeyListener.

Ablauf:
ich initialisiere ein Objekt von Record (da werden nurn paar Einstellungen gemacht). ich drücke eine Taste. In der keyPressed-Methode wird jetzt startRecording() am Record-objekt aufgerufen. diese methode macht weitere einstellungen und führt start() aus - ein neuer Thread wird gestartet, der die Aufnahme durchführt. Irgendwann drückt der nutzer eine taste. diese setzt im aufzeichnenden Record-objekt eine boolean-variable auf false, was das beenden der aufnahme verursacht. datei wird dabei geschieben und der vormals gestartete thread beendet (habs in netbeans gedebuggt, er ist aus der liste verschwunden).

soweit so gut, das funktioniert.

wenn ich jetzt wieder die aufnahmetaste drücke, wird wieder startrecord ausgeführt, einstellungen gemacht und start() ausgeführt. nur diesmal fliegt eine IllegalThreadStateException.

Ist es nicht genug, dass der vormals gestartete thread korrekt beendet ist? wo liegt das problem?

Java:
public class Recorder implements Runnable
{
private boolean recording;
public void startRecording() 
    {
       //paar vars setzen
recording=true;

        start();
    }
public void run()
    {
        //aufnahme... solange recording == true
    }
}

public class Main implements GlobalKeyListener
{
private Record rec;

public void keyPressed(GlobalKeyEvent gke)
    {
        Settings s = Settings.getInstance();

        if(gke.getConverted().equals(s.get("Remote", "Stop")))
            rec.stopRecording(); //setzt recording auf false

        if(gke.getConverted().toLowerCase().equals("r") )
        {
            if(!rec.isRecording())
                try
                {
                    rec.startRecording();
                }
                catch(Exception ex)
                {
                    Logger.add(ex);
                }
        }
    }
}
 
S

SlaterB

Gast
tja, Threads darf man nur einmal starten, so ist das in Java,
aber du hast ja gar nicht unbedingt einen Thread sondern nur ein Runnable,
wie sieht denn die start()-Methode aus, die ist doch wohl entscheidend und selbstimplementiert?
wenn da immer ein neuer Thread gestartet wird müsste es gehen, wenn ein altes Thread-Objekt wiederverwendet wird, dann nicht


dagegen helfen drei Möglichkeiten
1.
einfach immer
new Thread(runnable).start();
das sollte beliebig oft gehen, mit der Gefahr des Mehrfach-Starts parallel
1.
den einen Thread nie beenden, sondern nach Tastendruck höchstens pausieren (sleep/wait/notify) und weiterlaufen zu lassen
2.
indirekt arbeiten,
irgendwelche Basisklassen (z.B. ExecutorService oder ähnliche in der Java-API) bieten das Ausführen von Runnable an,
inwiefern darin Threads gestartet/ pausiert werden kann dem Aufrufer ganz egal sein,
beim start() lediglich das Runnable-Objekt dahin übergeben
 
tja, Threads darf man nur einmal starten, so ist das in Java,
Is nich dein ernst :autsch:

Ich kann kein neues Objekt erzeugen, d.h. das wäre zu ineffizient. Denn es muss, bevor man die Aufzeichnung starten kann, zunächst zu allen Aufnahmegeräten connected werden, was viel Zeit kostet (einige Sekunden). Das möcht ich auf jeden Fall vermeiden.

Möglichkeit 2 wär ne Option, das werd ich mal ausprobieren. Danke erstmal für die Hilfe
 
Zuletzt bearbeitet:
S

SlaterB

Gast
> Denn es muss, bevor man die Aufzeichnung starten kann, zunächst zu allen Aufnahmegeräten connected werden, was viel Zeit kostet (einige Sekunden).

ich weiß nicht genau was du meinst, vielleicht das Runnable-Objekt neu zu erzeugen,
das wäre aber gewiss nicht nötig,
wenn dann nur 'new Thread', das kostet wenig, wobei man auch neue Threads nicht unterschätzen sollte,
aber nur Java-intern im Hintergrund, in deinem Programm sollte das wenig Auswirkungen haben
 
ne, das war auf was anderes bezogen. will kein neues Recorder-Objekt erzeugen, deswegen such ich ne passende lösung.
Habs jetzt mal mit Vorschlag 1 versucht und es sieht ganz gut aus. Das Ding startet mehrfach. Zwar funktioniert er beim zweiten mal nicht (es kommen keine Daten in der Datei an), aber das liegt mit sicherheit an der verarbeitungskette des JMF. hab da garantiert beim beenden der 1. aufnahme irgend ein processor gestoppt und ihn bei startrecording nicht wieder gestartet.
ein mehrfachstart ist von vornerein nicht möglich. ich bin ja von ausgegangen, dass man in java nen thread mehrfach starten kann, somit hab ich im code bereits eine abfrage ob der recorder bereits läuft.

werde morgen mal schauen, wo ich den fehler hab.


danke für die hilfe
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben