alten Thread vor erneutem Aufruf schließen

Status
Nicht offen für weitere Antworten.

Nick0110

Mitglied
Hi,
habe ein kleinen soundplayer geschrieben. Die dateien sind in einer Playlist vorhanden und können nacheinander abgespielt werden. Die Klasse die zum abspielen der Sounddatei zuständig ist, ist ein thread. Jetzt habe ich das Problem, das mein Programm zu erst kontrollieren soll ob eine datei bereits abgespielt wird, wenn ja soll er diese vorher schliessen. Ansonsten neuen Thread aufrufen.
Mein Code sieht folgendermaßen aus.
Hauptklasse:

Code:
if ((player != null) && (player.isAlive())) {
			      player.stopPlaying();
			      player = null;
			   }
else {...
                  player = new Player(in);
			  player.start();
       }

Mein Thread:
Code:
public void stopPlaying(){
		if(player!= null){
			player.interrupt();
			
		weiter = false;
		line.close();
		player = null;
		}
public void startPlaying(){
	
		while(weiter){
		int readBytes =0;
		byte[] data = new byte[20000];
	        line.start();		
		do{
			try {
			readBytes = in.read(data,0,data.length);
		}catch (Exception e){
			MainClass.logger.error(e.getMessage());
			System.exit(-3);
			}
		if (readBytes!=-1) line.write(data, 0, readBytes);
		} while (readBytes != -1);
		  
	}

Außerdem braucht das Programm viel zu viel Ressourcen und ich kann mir nicht erklären weshalb...
Danke!
 

nebulo

Bekanntes Mitglied
Code:
public void stopPlaying(){
      if(player!= null){
         player.interrupt();
         
      weiter = false;
      line.close();
      player = null;
      }
public void startPlaying(){
   
      while(weiter){
      int readBytes =0;
      byte[] data = new byte[20000];
           line.start();      
      do{
         try {
         readBytes = in.read(data,0,data.length);
      }catch (Exception e){
         MainClass.logger.error(e.getMessage());
         System.exit(-3);
         }
      if (readBytes!=-1) line.write(data, 0, readBytes);
      } while (readBytes != -1);
       
   }

Also das Ganze ist sicher kein Thread. Der Thread ist das was du mit line.start() oder vielleicht player.start() startest. Also um dir weiterhelfen zu können müsstest du schon angeben was line für ein Objekt ist und wie die run-Methode von line und player aussieht.

Gruß nebulo
 

Nick0110

Mitglied
Also hier mal der ganze Code von meinem Thread:

Code:
public class Player extends Thread{
	
	static boolean weiter;
	private AudioInputStream in = null;
	private SourceDataLine line = null;
	static Thread player = new Thread();
	static FloatControl gainControl;
	FloatControl gain;
	
	
	public Player(AudioInputStream aui){ 	
		weiter = true;
		MainClass.logger.info("\n Thread start, Name des Thread: "+ this.getName()+"\n");
		
		try{
		
			in = aui;
			
			System.out.println(in);
			System.out.println(aui);
			}catch (Exception d){
				MainClass.logger.error(d.getMessage());
			}			

	AudioFormat format = in.getFormat();
	
	DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);
	try {
		line = (SourceDataLine)AudioSystem.getLine(info);
		MainFrame.source = (SourceDataLine)AudioSystem.getLine(info);
		line.open(format);
		
		System.out.println("Lautstärke : "+ gainControl);
		}catch (Exception e) {
			MainClass.logger.error(e.getMessage());
		System.exit(-2);
		}
		
		
	}
		
	public void stopPlaying(){
		if(player!= null){
			player.interrupt();
			
		weiter = false;
		line.close();
		player = null;
		}
		
	}
	
	public void pause(){
		line.stop();
		
	}
	
	public void resumeSound(){
		line.start();
	}
	
	public void run(){
		startPlaying();
	}
	
	public void startPlaying(){
	
		while(weiter){
		int readBytes =0;
		byte[] data = new byte[20000];
		
		
		int vol = 0;
				
		
		line.start();		
		do{
			try {
			readBytes = in.read(data,0,data.length);
		}catch (Exception e){
			MainClass.logger.error(e.getMessage());
			System.exit(-3);
			}
		if (readBytes!=-1) line.write(data, 0, readBytes);
		} while (readBytes != -1);
		  
	}
	
	}	
}

Danke für die Hilfe!
 

nebulo

Bekanntes Mitglied
So wie ich das verstehe instanzierst du momentan für jeden Song ein eigenes Player-Objekt!? Warum setzt du nicht einfach ein boolean playing auf true wenn das Objekt instanziert wird und ganz am Ende von startPlaying() auf false. Ebenso bei stopPlaying. Dann brauchst du nur noch ein Methode isPlaying die dir playing zurückgibt.

Dann kannst du einfach so oder so ähnlich prüfen ob ein Song abgespielt wird:

Code:
if(!playerobeject.isPlaying()){
   playerobject = new Player(in);
   playerobject.start();
}


Oder hab ich jetzt mißverstanden was dass Problem ist?

Du solltest übrigens die startPlaying() private deklarieren und vielleicht synchronized. Bin selbst nicht der Experte was Threads betrifft.
 

Saxony

Top Contributor
nebulo hat gesagt.:
Du solltest übrigens die startPlaying() private deklarieren und vielleicht synchronized. Bin selbst nicht der Experte was Threads betrifft.

Dem private stimme ich zu.
Aber wenn (wirklich) nur ein Thread auf eine Methode zugreift, sollte man das synchronized weglassen.
Dazu muss aber sicher gestellt sein, dass keine Laufzeitabhängigkeiten (race conditions) der (unsynchronisierten) Methode zu anderen Threads bestehen.

[edit]
So das mit synchronized ist egal. Laut dem hier gibt es keine Laufzeiteinbußen.
[/edit]

bye Saxony
 

Nick0110

Mitglied
Eine boolean Variable hab ich ja drin, ist in meinem Fall boolean weiter. Irgendwie hat sich das Problem auch wieder erledigt. Mit

Code:
if(player != null){
	                player.stopPlaying();
	                player.interrupt();
	            player = null;
}

wird der Thread wieder geschlossen. Aber wie kann ich noch das Ende des Audiosignals abfragen, damit der Thread automatisch geschlossen wird? Bisher muss ich immer auf den Button stop drücken, der obigen Code ausführt.
 

nebulo

Bekanntes Mitglied
Hm also ich bin mir nicht sicher was du willst.
Code:
while(weiter){
      int readBytes =0;
      byte[] data = new byte[20000];
      
      
      int vol = 0;
            
      
      line.start();      
      do{
         try {
         readBytes = in.read(data,0,data.length);
      }catch (Exception e){
         MainClass.logger.error(e.getMessage());
         System.exit(-3);
         }
      if (readBytes!=-1) line.write(data, 0, readBytes);
      } while (readBytes != -1);

Das ist ja der eigentliche Code, der innerhalb des Threads ausgeführt wird. Wenn nun also keine weiteren Bytes mehr gelesen werden (also readBytes == -1) ist die Datei zu Ende und damit die Methode abgerabeitet.
 

Nick0110

Mitglied
Ja das sehe ich auch so. Aber mein Taskmanager sagt anderes. Beim abspielen werden ca. 50% Ressourcen verbraucht, die nach dem Ende der Datei eigentlich wieder freigegeben werden müssten. Das ist aber nicht der Fall, erst wenn ich den stop Button betätige. Der Code zum stop button sieht so aus:

Code:
if (label.equals("stop")){
			
			 if(player != null){
	                player.stopPlaying();
	                player.interrupt();
	            player = null;
	            recStatus.setForeground(Color.BLACK);
	            recStatus.setText("stop");
}

Wieso wird der Thread nicht automatisch gekillt, wenn die Datei fertig gelesen wurde?
 

nebulo

Bekanntes Mitglied
Ich meine das ist sicher keine saubere Lösung aber dann führe am Ende der startPlaying() doch einfach diesen Code aus. ...
 

Nick0110

Mitglied
Ha,
ich glaub ich hab das Problem gefunden,
in der if-Anweisung hat das else gefehlt, somit wurde weiter nie auf false gesetzt :idea: und er kam nie aus der Do-while schleife raus.
Code:
if (readBytes!=-1) line.write(data, 0, readBytes);
		else weiter = false;

Wahnsinn....
Danke :D
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
D Neue Array übernimmt Werte des alten nicht Java Basics - Anfänger-Themen 5
Developer_X Die Kunst der Alten Runen in Chars, leider nicht in String konvertierbar? Java Basics - Anfänger-Themen 28
ven000m Eclipse startet nicht mehr nach Deinstalltion von alten JRE Java Basics - Anfänger-Themen 6
G Variable nur ändern wenn. sonst alten Wert behalten Java Basics - Anfänger-Themen 8
D alten Container wieder aufrufen Java Basics - Anfänger-Themen 11
O Bei FileDialog alten Inhalt löschen Java Basics - Anfänger-Themen 7
G Text übertragen, ohne alten zu überschreiben Java Basics - Anfänger-Themen 6
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben