Private-Thread-Interrupting

Unicate

Erfahrenes Mitglied
Hi!

ich habe eine Klasse geschrieben die einen bestimmten Zeitraum warten soll, dann etwas ausführen und danach wieder warten soll.
Das Ausführen klappt soweit, mein Problem ist das unterbrechen der warterei:

Java:
public class Klasse{
	private Thread timer = null;
	private boolean running = true;
	
	
	private Klasse() {
		

		while(running) {
			// Timer wartet 2 sekunden und beendet thread
			timer = new Thread(new Timer(2000));
			timer.start();
			try {
				timer.join();
			} catch (InterruptedException e1) {
				running = false;
			}
			// hier etwas ausführen
			ichMachWas();
			
		}


	}
	public static void main(String args[]) {
		Klasse main = new Klasse();
	}
	protected void stopTimer() {
		timer.interrupt();
		
	}
Hier noch der Timer:
Java:
public class Timer implements Runnable {
	private long millis = 0;
	
	public Timer(long millis) {
		this.millis = millis;
	}

	@Override
	public void run() {
		try {
			System.out.println("warte " + millis + "ms.");
			Thread.sleep(millis);
			System.out.println("habe " + millis + "ms gewartet");
		} catch (InterruptedException e) {
			System.out.println("got interrupted!");
		}
		
	}

}

Theoretisch sollte es funktionieren, aber das tut es nicht.
Was mach ich falsch?
 
Zuletzt bearbeitet:
Ich habe nirgendwo gesehen, dass du die Methode start() des Threads aufrufst, also läuft der Thread auch nicht.

Abgesehn davon glaube ich, dass du dir mal die Klasse java.util.Timer anschauen solltest, die ist in der Lage TimerTasks auszuführen und das Ausführen ist nun Sache der Art, wie man sie ausführen will, in bestimmten Intervalen oder wie auch immer, kann man damit alles machen.
 
Mich beschleicht der Verdacht, dass du den Sinn von Threads noch nicht ganz verstanden hast.
Wenn du z.B. gleichzeitig in zwei Fenstern Animationen zeichnen möchtest, brauchst du für jedes Fenster einen eigenen Thread.
Wenn du aber den Ablauf Warten-Funktion-Warten-Funktion-... haben möchtest, musst du dich entscheiden, ob (1.) dein Programm nur diesen Ablauf machen soll, oder ob (2.) nebenher noch etwas anderes ausgeführt wird.
Im ersten Fall brauchst du keinen Thread:
Java:
while(true){
    try{
        Thread.sleep(2000);
    }catch(Exception e){}
    machWas();
}
Wenn aber der Ablauf irgendwann (z.B. nach Ablauf einer Zeitspanne von 15 Sekunden) beendet werden soll, musst du das in einen Thread packen:
Java:
class Timer implements Runnable{
    private int sleepTime = 0;
    public boolean running = true;
    public Timer(int st){
        sleepTime = st;
    }
    public void run(){
        while(running){
            System.out.println("Warte...");
            try{
                Thread.sleep(sleepTime);
            }catch(Exception e){}
            System.out.println("Habe gewartet.");
        }
    }
}
class MainThread{
    public MainThread(){
        Timer timer = new Timer(2000);
        Thread t = new Thread(timer);
        t.start();
        try{
            Thread.sleep(15000);
        }catch(Exception e){}
        timer.running = false;
    }
    public static void main(String[] args){
        new MainThread();
    }
}
 
Sorry ich habe nicht kopiert, deswegen das start vergessen. Sollte aber im code sein (UPDATE: code oben)
@Jellysheep: Ist mir schon bewusst.

OK noch mal die Sachlage beschreiben:

  • Wenn ich das Programm schließe sollte das Warten abgebrochen werden und das programm geschlossen werden
  • Wenn ich auf einen Button druecke sollte das Programm den wartevorgang abbrechen und sofort machWas() aufrufen und danach wieder in die Warteschleife springen.
  • Wenn nichts gedrueckt wird soll machWas(); alle 10 Minuten ausgeführt werden.
 
Zuletzt bearbeitet:
OK, hier eine funktionierende Version:

Java:
package de.unicate.playground;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class Playground {
	private Thread timer;
	private boolean running = true;
	
	
	private Playground() {
		final JFrame displayFrame = new JFrame("Klick or Cancel");
		JButton cancelButton = new JButton("Cancel");
		cancelButton.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Unterbreche warten um Programm zu beenden");
				timer.interrupt();
				running = false;
				displayFrame.dispose();
				
				
			}
		});
		JButton updateButton = new JButton("Klick");
		updateButton.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Unterbreche warten zu klicken");
				timer.interrupt();
				
				
			}
		});
		
		
		JPanel panel = new JPanel();
		panel.add(updateButton);
		panel.add(cancelButton);
        displayFrame.getContentPane().add(panel, BorderLayout.CENTER);
        displayFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        displayFrame.setResizable(false);
        displayFrame.setLocationRelativeTo(null);
        displayFrame.pack();
        displayFrame.setVisible(true);
        
		while(running) {
			timer = new Thread(new Timer(3000));
			timer.start();
			try {
				timer.join();
			} catch (InterruptedException e) {
				// do nothing
			}
			if(running) {
				System.out.println("machwas");
			} else {
				System.out.println("Beende Programm");
			}
		}
	}
	
	public static void main(String[] args) {
		Playground start = new Playground();
		
		
	}
}

Und hier noch der Timer:
Java:
package de.unicate.playground;



public class Timer implements Runnable {
	private long millis = 0;
	
	public Timer(long millis) {
		this.millis = millis;
	}



	@Override
	public void run() {
		try {
			System.out.println("warte " + millis + "ms.");
			Thread.sleep(millis);
			System.out.println("habe " + millis + "ms gewartet");
		} catch (InterruptedException e) {
			// do nothing
			e.printStackTrace();
		}
		
	}

}
 
Zurück