Einfaches Threadbeispiel..

fhs14647

Mitglied
Werte Java-Profis

Ich bin am Verzweifeln mit diesem Anfängerproblem. Ich möchte in einem JFrame mit dem Start Buttons einen Thread laufen lassen bzw. dann mit dem Beenden -Button beenden (beenden mit der empfohlenen interrupt()-Methode).

Ich kapier einfach die Logik der Interrupt-Methoden im Internet nicht. Super wäre noch eine kurze Erklärung der Lösung. Tausend Dank vorab. (fhs14647)

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

public class Guitest extends JFrame implements Runnable, ActionListener{

	private JPanel contentPane;
	private JButton btnStart;
	private JButton btnBeenden;
	private boolean running = true;
	private Thread t;
	private Guitest g;
	

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

	/**
	 * Create the frame.
	 */
	public Guitest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		btnStart = new JButton("Start");
		btnStart.addActionListener(this);
		btnStart.setBounds(39, 200, 89, 23);
		contentPane.add(btnStart);
		
		btnBeenden = new JButton("Beenden");
		btnBeenden.setBounds(164, 200, 89, 23);
		contentPane.add(btnBeenden);
	}


	@Override
	public void actionPerformed(ActionEvent e)
	{
		
		Object o = e.getSource();
		if(o == this.btnStart)
		{
			
			g = new Guitest();
			t  = new Thread(g);
			t.start();
			
			
				
		}
			
			
		
		if(o == this.btnBeenden)
		{
			
			
			t.interrupt();
			
		}
		}
		
	
	@Override
	public void run() {
		
		
		while(true)
		{
		
		System.out.println("testing..." );
		
		}
		
		
}}
 
Zuletzt bearbeitet:

eMmiE

Bekanntes Mitglied
Das mit der interrupt()-Methode erkläre ich mir so, dass der Thread, wenn er gerade mitten dabei ist, in einer Methode zu rechnen, wozu er Daten vom Speicher einlesen und verarbeiten muss, wenn er dann unterbrochen wird, bei der stop()-Methode einfach abgebrochen wird und somit möglicherweise noch nur halbwegs geschriebene Daten hinterlässt. Wei genau das abläuft, kann ich dir nicht sagen, aber ich denke, wenn eine Thread mit interrupt() abgebrochen wird, wartet das Programm, bis er an einer geeigneten Stelle ist, wo er nichts mehr zu bearbeiten hat, und bricht ihn dann ab. So wird wahrscheinlich verhindert, dass Probleme beim Speicher entstehen

Gruß eMmiE

P.S.: Ich google mal ein bisschen...
 

knilch

Bekanntes Mitglied
Hi,
Einen Thread mit interrput() abbrechen ist eigentlich nicht so der Hit. Besser ist, den Thread kontrolliert zu beenden.
Durch einen Interrrupt kann es zu inkonsistenten Daten kommen. Dies kann dann ganz böse Folgen haben
Hier ein paar infos und Korrekturen:
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;

@SuppressWarnings("serial")
public class Guitest extends JFrame implements Runnable, ActionListener{


	private JPanel contentPane;
	private JButton btnStart;
	private JButton btnBeenden;
	private boolean running = true;
	private Thread thread;

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

	/**
	 * Create the frame.
	 */
	public Guitest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		btnStart = new JButton("Start");
		btnStart.addActionListener(this);
		btnStart.setBounds(39, 200, 89, 23);
		contentPane.add(btnStart);

		btnBeenden = new JButton("Beenden");
// btnBeenden muss auch noch an den ActionListener registiert werden.. dies fehlt in deinem Code.
//Ohne diese Registrierung hat der Button keine Funktion
                btnBeenden.addActionListener(this);  
		btnBeenden.setBounds(164, 200, 89, 23);
		contentPane.add(btnBeenden);
	}


	@Override
	public void actionPerformed(ActionEvent e) {

		Object o = e.getSource();
		if(o == this.btnStart) {
			thread  = new Thread(this);
			running = true;	// falls btnStart gedrückt wird, running auf true setzten. Dann kann der Thread arbeiten.
			thread.start();	 
		}


		if(o == this.btnBeenden) {
			running = false; 	// falls btnBeenden gedrückt wird, running auf false setzten. Dann wird der Thread beendet
			System.out.println("fertig");
		}
	}


	@Override
	public void run() {
		// Wenn: while(true) steht, (wie es in deinem Code steht), dann wird der Thread ewig ausgeführt... (bis mit CTRL + C abgebrochen wird)
		while(running) {  
			System.out.println("testing..." );
		}

	}}
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich rate mal sich SwingWorker genauer anzuschauen, weil damit genau unterstützt wird, was du benötigst.
Ich habe dazu mal einen Blog-Eintrag geschrieben;) Insbesondere wird darin auch auf die Problematik des Cancelns (Stoppen) eines Hintergrund-Threads eingegangen.
 

rme

Top Contributor
Hi,
Einen Thread mit interrput() abbrechen ist eigentlich nicht so der Hit. Besser ist, den Thread kontrolliert zu beenden.

Da möchte ich gern widersprechen. Durch interrupt() kann es nicht zu inkonistenten Zuständen kommen, da es sich um ein kontrolliertes Beenden handelt. Durch interrupt wird nämlich kein Code unterbrochen, der Berechnungen oder so anstellt - es werden nur wartende Methoden wie sleep() mit einer InterruptedException unterbrochen. Weiterhin wird ein Flag im Thread gesetzt, mit dem man prüfen kann, ob ein Thread beendet werden soll. Genau wie das Flag "running", das du eingeführt hast. Darauf kann man also verzichten und es folgendermaßen machen:

Java:
while(!Thread.interrupted()) {
  System.out.println("testing..." );     
}

Sein ursprüngliches Beispiel hat nicht funktioniert, weil im Thread nicht auf die Unterbrechung geprüft wurde - eben weil interrupt nicht einfach inkonsistent den Thread unterbricht, sondern man das manuell abfragen muss. Der Vorteil ist, dass Methoden wie sleep() unterbrochen werden, damit man sofort reagieren kann.
 
Zuletzt bearbeitet:

fhs14647

Mitglied
Werte KollegenInnen

Erstmals vielen, vielen Dank für Eure Hilfe und super Tipps, in die ich mich aber noch weiter einlesen muss.

Ich habe den Tipp von Knilch und rme ausprobiert und beides funkt super, danke !!! (worker muss ich noch einlesen...)

Dann wollte ich das Gelernte bei einem selbst gebastelten MP3-Player testen und ich schaff es nicht, da hier nicht nur 1 sondern 3 Klassen beteiligt sind.

Ich habe das ganze Eclipse Projekt hier upgeloaded, vielleicht hat ja noch einer von Euch noch Lust, das direkt im Projekt zu implementieren. Der mp3-Player funkt, jedoch habe ich die stop()-Methode verwendet, die aber depricated ist.
https://sites.google.com/site/bildungscenterunterlagen/amtssignatur

Ich schaffe es einfach nicht so, wie Ihr das beschrieben habt...

Vielen Dank nochmals
fhs

..hier der Quellcode (mit der Stop -Methode soll ein MP3-Song beendet werden könnne)

Java:
package at.gys.mp3;

import java.io.InputStream;
import java.net.URL;

import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;

import javazoom.jl.player.Player;
import javazoom.jl.player.advanced.AdvancedPlayer;

public class PlayerClass implements Runnable {
	
		private AdvancedPlayer pl;
		private InputStream in;
		


	@Override
	public void run() {
		
		
		{
		
			        try{
			        	
			        	//Filefilter zum Einschränken der möglichen Medien
			        	FileFilter filter = new FileNameExtensionFilter("Sound", "mp3");
			        	// JFileChooser-Objekt erstellen
			            JFileChooser chooser = new JFileChooser();
			            // Dialog zum Oeffnen von Dateien anzeigen
			            chooser.setFileFilter(filter);
			           
			            int rueckgabeWert = chooser.showOpenDialog(null);
			            
			            /* Abfrage, ob auf "Öffnen" geklickt wurde */
			            if(rueckgabeWert == JFileChooser.APPROVE_OPTION)
			            {
			                 // Ausgabe der ausgewaehlten Datei
			                
			                String path = "file:///" + chooser.getSelectedFile().getPath();
			                URL url = new URL(path);
			                in = url.openStream();
			                AdvancedPlayer pl = new AdvancedPlayer(in);
			                pl.play();
			              }
			            }
			        catch(Exception e)
			        {
			            System.out.println("Datei nicht gefunden : "+e);
			        }
			        System.out.println("T beendent");
		}
				
	}


	
}

Java:
package at.gys.mp3;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JLabel;

import java.awt.Color;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;

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

public class GuiPlayer extends JFrame implements ActionListener {

	private JPanel contentPane;
	private JButton btnPlay;
	private JButton btnStop;
	private JButton btnAppBeenden;
	private JLabel lblAnzeige;
	private PlayerClass p;
	private PlayerClass p1;
	private Thread t;
	
	

	/**
	 * Launch the application.
	 */
	

	/**
	 * Create the frame.
	 */
	public GuiPlayer() {
		setTitle("Mp3 Player by M.W.");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		btnPlay = new JButton("Play");
		btnPlay.setBounds(33, 202, 89, 23);
		btnPlay.addActionListener(this);
		contentPane.add(btnPlay);
		
		btnStop = new JButton("Stop");
		btnStop.setBounds(151, 202, 89, 23);
		btnStop.addActionListener(this);
		contentPane.add(btnStop);
		
		btnAppBeenden = new JButton("App Beenden");
		btnAppBeenden.setBounds(291, 202, 115, 23);
		btnAppBeenden.addActionListener(this);
		contentPane.add(btnAppBeenden);
		
		lblAnzeige = new JLabel("");
		lblAnzeige.setIcon(new ImageIcon(GuiPlayer.class.getResource("/assets/start.png")));
		lblAnzeige.setBackground(SystemColor.textHighlight);
		lblAnzeige.setBounds(33, 34, 361, 139);
		contentPane.add(lblAnzeige);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		
		
		Object o = e.getSource();
		
		if(o == this.btnAppBeenden)
		{
			
			System.exit(0);
		}
		
		if(o == this.btnPlay)
		{
			lblAnzeige.setIcon(new ImageIcon(GuiPlayer.class.getResource("/assets/player.gif")));
			
			p = new PlayerClass();
			t = new Thread(p);
			t.start();
			
			
			
			
		}
		
		if(o == this.btnStop)
		{
			 
			 t.stop();
			 lblAnzeige.setIcon(new ImageIcon(GuiPlayer.class.getResource("/assets/start.png")));
			
		}
		
		
	}
}


Java:
package at.gys.mp3;

public class Verwaltung {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		GuiPlayer frame = new GuiPlayer();
		frame.setVisible(true);
		

	}

}
 
Zuletzt bearbeitet:

fhs14647

Mitglied
Werte Profis

Ich schließe die Anfrage. Die von Euch geschilderten Lösungen funktionieren. Das Problem, dass ich beim Beenden von Songs mit meinem mp3-Player habe, liegt in der verwendeten externen Bibliothek von Javazoom.

Meine Thread-Anfrage wurde gelöst, vielen Dank nochmals an Euch!!

fhs14647
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R OOP Einfaches Programmierbeispiel für Assoziation, Aggregation und Komposition gesucht Java Basics - Anfänger-Themen 10
Kamy Ein einfaches "Vier Gewinnt" Spiel für Anfängerin Java Basics - Anfänger-Themen 51
J Einfaches Quadrat auf der Console ausgeben lassen Java Basics - Anfänger-Themen 7
H ein einfaches Tic Tac Toe Spiel Java Basics - Anfänger-Themen 1
L Einfaches Kartenspiel (Spieler Klasse) Java Basics - Anfänger-Themen 14
R Einfaches refresh während runtime Java Basics - Anfänger-Themen 4
M JSP-Einfaches Bild anzeigen Java Basics - Anfänger-Themen 4
S Referentielle Integrität ? (Einfaches Bsp) Java Basics - Anfänger-Themen 2
G Erste Schritte Einfaches Gästebuch erstellen mit Array Java Basics - Anfänger-Themen 7
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
H Erste Schritte Einfaches Programm und GUI zusammen bringen Java Basics - Anfänger-Themen 3
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
B OOP einfaches regex Java Basics - Anfänger-Themen 10
K einfaches Drucken von Text (und ggf Bildern,gemischt) Java Basics - Anfänger-Themen 11
M Ganz einfaches Beispiel, finde den Fehler aber nicht :( Java Basics - Anfänger-Themen 2
S Einfaches Regulaerer Ausdruck Problem Java Basics - Anfänger-Themen 7
E einfaches Schachbrett generieren Java Basics - Anfänger-Themen 9
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
S einfaches Pokerprogramm Java Basics - Anfänger-Themen 52
S KeyListener für einfaches Programm Java Basics - Anfänger-Themen 3
H einfaches Array -> ']' expected Java Basics - Anfänger-Themen 9
H Webservice - Einfaches Beispiel Java Basics - Anfänger-Themen 2
F Ich raffs nicht! - Wie mache ich ein einfaches Java-window? Java Basics - Anfänger-Themen 54
S Einfaches int Array gibt über System.out.println merkwürden Wert aus Java Basics - Anfänger-Themen 9
K Einfaches Bubblesort Java Basics - Anfänger-Themen 11
O einfaches rechnen mit zahlen Java Basics - Anfänger-Themen 4
H Einfaches Date-parse problem Java Basics - Anfänger-Themen 2
T Array auf einfaches Element umwandeln Java Basics - Anfänger-Themen 8
G einfaches Regex Problem Java Basics - Anfänger-Themen 4
M EInfaches Addieren mit Abbruchbedingung Java Basics - Anfänger-Themen 9
M [Einfaches Beispiel] Problem mit innere Klassen Java Basics - Anfänger-Themen 4
S Einfaches Rechenprogramm Java Basics - Anfänger-Themen 2
G Einfaches Rechenprogramm schreiben! Java Basics - Anfänger-Themen 8
A ausgabe eines arrays - einfaches beispiel Java Basics - Anfänger-Themen 4
M Einfaches Menü erstellen Java Basics - Anfänger-Themen 106
D was ist denn nun schon wieder? Einfaches JSP. Java Basics - Anfänger-Themen 6
D Ein einfaches Problem aber ich brauche einen TIP Java Basics - Anfänger-Themen 2
R einfaches Programm, viele Probleme Java Basics - Anfänger-Themen 29
C Einfaches Paint-Programm Java Basics - Anfänger-Themen 9
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
F einfaches Menue in einer Textkonsole Java Basics - Anfänger-Themen 4
W einfaches Frame öffnen Java Basics - Anfänger-Themen 2
N Wahrscheinlich ganz einfaches Problem, aber unverständlich! Java Basics - Anfänger-Themen 3
S einfaches script mit Eingabeaufforderung starten (javac) Java Basics - Anfänger-Themen 8
B Einfaches Speichern und Laden in Java? Java Basics - Anfänger-Themen 3
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
P einfaches Perl-Skript aufrufen Java Basics - Anfänger-Themen 7
G einfaches jdialog beispiel Java Basics - Anfänger-Themen 1
B Oberflaecheprog einfaches beispiel (button action listener) Java Basics - Anfänger-Themen 5
N Vermutlich einfaches Problem.. Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben