Threads Java Zugreifen

pfeilda

Mitglied
Hallo Leute,

folgendes Problem das ich einen Thread habe der einen Musikplayer mit jLayer startet er läuft auch los und läuft auch die Playlist durch. Aber wenn ich die Stop methode Ausrufe passiert nichts ???:L???:L wieso auch immer wäre cool wenn man mir erklären könnte wie ich von der Main auf die Stop Funktion so zugreifen kann damit ich die Play Funktion abbrechen kann.
Main:
Java:
package player;

import java.awt.EventQueue;

public class Main {

	private JFrame frame;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Main window = new Main();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Main() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		final MusicPlayer player = new MusicPlayer();
		
		player.addSongToPlayList("C:/Users/Daniel/Music/P!nk - Funhouse.mp3");
		player.addSongToPlayList("C:/Users/Daniel/Music/Pirates of The Caribbean - Soundtrack.mp3");
		player.addSongToPlayList("C:/Users/Daniel/Music/Tetris Soundtrack - 8-Bit theme.mp3");
		
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JButton btnPlay = new JButton("Play");
		btnPlay.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent arg0) {
				player.startPlayer();
			}
		});
		btnPlay.setBounds(10, 11, 89, 23);
		frame.getContentPane().add(btnPlay);
		
		JButton btnStop = new JButton("Stop");
		btnStop.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				player.stop();
			}
		});
		btnStop.setBounds(10, 45, 89, 23);
		frame.getContentPane().add(btnStop);
	}
}

Player:
Java:
package player;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Vector;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

public class MusicPlayer{
	
	private final Object lock = new Object();
	
	private final static int NEVERSTARTED = 0;
	private final static int NOTSTARTED = 1;
	private final static int PLAYING = 2;
	private final static int PAUSED = 3;
	private final static int FINISHED = 4;
	private int status = NEVERSTARTED;
	
	private Thread playerThread;
	
	private int currentID = 0;
	private Player player;
	private Vector<String> playList = new Vector<String>();
	
	public void addSongToPlayList(String fileUrl){
		playList.addElement(fileUrl);
	}
	
	public Vector<String> getPlayList(){
		return playList;
	}
	
	public void setFile(String fileURL){
		FileInputStream fis;
		try {
			fis = new FileInputStream(fileURL);
			player = new Player(fis);
		} catch (FileNotFoundException | JavaLayerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void play(){
		synchronized(lock){
			while(status == PLAYING){
				for(int i = 0; i < playList.size(); i++){
					String fileURL = (String) playList.elementAt(currentID);  
					setFile(fileURL);
						try {
							player.play();
						} catch (JavaLayerException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					System.out.println(currentID);
					currentID++;
				}
			}
		}
	}
	
	public void stop(){
		synchronized(lock){
			status = FINISHED;
			lock.notifyAll();
		}
	}
	
	public void startPlayer(){
		synchronized(lock){
			switch(status){
				case NEVERSTARTED:
					Runnable playerRunnable = new Runnable() {
						public void run() {
							play();
						}
					};
					playerThread = new Thread(playerRunnable);
					playerThread.setName("Player");
					playerThread.setDaemon(true);
					playerThread.setPriority(Thread.MAX_PRIORITY);
					status = PLAYING;
					playerThread.start();
					break;
			}
		}
	}
}
 
Du müsstest eine Methode erstellen, die auf Player zugreifen kann und diesen stoppt.
Ich kenne die Methoden, die Player zu Verfügung stellt nicht aber ein stop() müsste dabei sein.
 
ja ich weiß das das gehen sollte aber wenn man versucht den Code auszuführen tut er das nicht sondern wartet wenn ich auf stop Klick bis alle Lieder durchgelaufen sind was ja nicht gewünscht ist!
 
Ich denke mal Gucky meint eine evtl. vorhandene stop() Methode der "javazoom.jl.player.Player" Klasse.

ZU deinem Problem:
Wie ich vermute ist die play() Methode (Zeile 53) ein blockierender Aufruf? So oder so, es muss erst die ganze Playlist durchlaufen werden bevor das "status" Flag in der while Anweisung abgefragt wird. Das würde dein Problem erklären. Würde auch heissen, dass wenn du nicht auf stoppst, die Playlist wieder von vorne anfängt.

Das sind meine Vermutungen. Ich schreibe extra "Vermutungen", weil auch nach all den Jahren stolpere ich immer noch über synchronized und notify. Vor allem mit locking Objekten.
 
Sorry Leute aber das ist nicht mein Problem ich weiß sehr wohl wie ich den Player killen kann aber der Klick auf stop wird nicht ausgeführt =(
 
Ach so. Dann müssen deine Aussagen präziser werden 😉 ich war der Meinung, der Klick wird zwar ausgeführt, aber der Player reagierte nicht darauf.

Also kommt der Klick auf den Button nicht einmal im Listener an?

Versuch es einmal mit einem ActionListener, der für Buttons eigentlich das Mittel der Wahl ist.
 

Neue Themen


Zurück
Oben