Thread mehrmals starten und schliessen

Geryones

Mitglied
hallo

ich habe es zuerst mit Google versucht, aber wohl nach dem falschen gesucht 🙁

Mein Programm hat einen Timer, dieser muss mehrmals aufgerufen werden können. Ich möchte den aber auch abbrechen können.

Java:
public class theHandler implements ActionListener {
		
		public void actionPerformed(ActionEvent e) {
				
			if (e.getSource() == btnStart) {

				Thread t1 = new Thread(new Timer());
				lblRechnung.setText(calc.Rechnung(100));
				t1.start();
				if (e.getSource() == btnStop) {
					t1.stop();
				}
			}

Leider läuft der Timer ungehindert weiter wenn ich den Stop-Button drücke.
Wenn ich das if-Statement für Stop aus dem if-Statement Start rausnehme, kann ich t1 nicht mehr ansteuern, da das Objekt nicht sichtbar ist.

Leider habe ich noch keine Möglichkeit gefunden, das Objekt für den Thread ausserhalb von der Funktion zu kreieren, da ich es mehrmals aufrufen will.

Wie schaffe ich es also, dass ich mit dem Stop-Button den Thread t1 stoppen kann?

Danke im Vorraus.
 
Huhu,

Was heißt denn "...,da ich es mehrmals aufrufen will." also mehrere Threads oder an mehreren Stellen im Quellcode?

Kleiner Tipp:

Vergleiche mit Objekten macht man normalerweise mit equals also:

Java:
if( e.getSource().equals(btnStop) ){
  // stoppe thread
}
 
Zuletzt bearbeitet:
Mit mehrmals starten meinte ich nicht im Code, sondern bei der Nutzung des Programms. Es läuft ein Timer ab und hat eine bestimmte Zeit um so viele Aufgaben wie möglich zu lösen. Während der Timer läuft ist der Start button disabeld. Aber nach ablauf der Zeit soll man den Timer wieder starten können mit dem Start-Button.

Der Stop-Button soll den Timer-Thread beenden.
 
Zuletzt bearbeitet:
Wenn du den Code, der prüft ob stop gedrückt wurde in einen bedingten Block packst, der auf den Start-Button prüft, ist das nicht weiter verwunderlich.

Schau dir mal Zeile 5 und Zeile 10 bzw. die Klammerung des if in Zeile 5 nochmal an!

Anders gesagt: Klammer in Zeile 13 weg und zwischen 9 und 10 eingefügt, dann läufts.
 
Zuletzt bearbeitet:
Vergleiche mit Objekten macht man normalerweise mit equals also:

damit diese Aussage zu verallgemeinern wäre ich doch recht vorsichtig 😉

in sofern die Objekte inhaltlich identisch sein sollen ist das legitim , wenn es nur um Referenzgleichheit geht reicht ein einfacher Vergleich per
Code:
==

Bei eigens erstellten Klassen und dessen Objekten ist es oft so das equals nicht richtig, oder gar nicht überschrieben ist/wird. dann wird ebenfalls die Standardimplementierung der klasse Objekt verwendet, welche wiederum das hier macht

Java:
 public boolean equals(Object obj) {
        return (this == obj);
    }
 
Zuletzt bearbeitet:
ich würde mir das nicht zu kompliziert machen, ein Runnable erstellen , welches mir die gewünschten Funktionen liefert, und dies dann eben starten oder beenden , bei Threads ist das immer so eine Sache mit dem ausführen....bzw. beenden, und wenn du den Thread nicht schedulen möchtest lass den Timer da weg....

falls du jedoch den Timer benötigst , kannst du anstelle das Runnable zu implementieren einfach eine Klasse erstellen welche du von TimerTask ableitest, und dann deinem Timer einfach eine Instanz dieser Klasse übergeben.

Hier ein Beispiel wie man das ganze mit einem Runnable machen könnte, es geht natürlich auch mit einem Timer und einem TimerTask , aber wie gesagt , wenn du nichts schedulen möchtest brauchst du keinen Timer nutzen .

um gewisse Probleme zu umgehen, erstelle ich beim Starten einen neuen Thread, und setzen die Referenz beim stoppen auf null.

Hier mal ohne implementation einer "Wartefunktion".

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


@SuppressWarnings("serial")
public class Example extends JPanel implements ActionListener{

	static String[] LABEL = {"Start","Stop","Wait"};
	JButton[] btns;
	
	Task task;
	
	public Example(){
		setPreferredSize(new Dimension(250,150));
		
		btns = new JButton[3];
		for (int i = 0; i < btns.length; i++) {
			btns[i] = new JButton(LABEL[i]);
			btns[i].addActionListener(this);
			add(btns[i]);
		}
		
		task = new Task(1000);
	}
	
	@Override
	public void actionPerformed(ActionEvent e){
		switch(e.getActionCommand()){
		case "Start":
			System.out.println("Task started !");
			task.start();
			break;
		case "Stop": 
			System.out.println("Task stopped !");
			task.stop();
			break;
		case "Wait":
			System.out.println("Waiting...");
			//
			break;
		}
	}

	//////////////////	Task	//////////////////////////////
	
	class Task implements Runnable{
		
		Thread thread;
		boolean running;
		long delay;
		
		public Task(long delay){
			this.delay = delay;
		}
		
		@Override
		public void run(){
			while(running){
				System.out.println("Hallo Welt");
				
				try {
					Thread.sleep(delay);
				}
				catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}
		
		public void start(){
			
			running = true;
			
			if(thread == null) {
				thread = new Thread(this);
				thread.start();
			}
		}
		
		public void stop(){
			running = false;
			thread = null;
		}
	}
	
	public static void main(String[] args){
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		f.setContentPane(new Example());
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben