Timer: period während Verlauf wechseln

Marco7757

Aktives Mitglied
Ich habe einen Timer der alle 1000 Millisekunden (1 Sekunde:
Code:
int period = 1000;
) etwas macht.
Kann ich nun, während der Timer läuft, diese Periode auf z.B. 500 Millisekunden setzen, oder muss ich den Timer beenden und einen neuen erstellen?
 

Marco7757

Aktives Mitglied
Der Code:

Java:
int delay = 1000;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
	public void run() {
		//CODE
	}
}, delay, points.getLevelSpeed());

Wie zu sehen ist, hängt die Geschwindigkeit meines Tetrisspiels davon ab, in welchem Level der Spieler ist (
Code:
points.getLevelSpeed();
). Daher kann ich keine feste Zeit für das Umschalten angeben ...

@Michael ...
Ich habe schon gemerkt, dass der Timer wohl nicht wirklich das richtige ist. Allerdings habe ich keine Ahnung, wie die Varianten, die du vorschlägst funktionieren ...
 

Michael...

Top Contributor
Ich habe schon gemerkt, dass der Timer wohl nicht wirklich das richtige ist.
So habe ich das nicht gemeint, meinte nur es gibt auch eine Welt ohne Timer/TimerTask ;-)

Mit TimerTask könnte man das so machen:
Java:
	public static void main(String[] args) {
		Timer timer = new Timer();
		TimerTask task = createNewTask();
		timer.schedule(task, 0, 500);
		try {Thread.sleep(3000);}//kuenstliche Pause, um das Warten auf Events o.ä. zu simulieren
		catch (InterruptedException e) {e.printStackTrace();}
		task.cancel();
		timer.purge();
		task = createNewTask();
		timer.schedule(task, 0,100);
		try {Thread.sleep(3000);}//kuenstliche Pause, um das Warten auf Events o.ä. zu simulieren
		catch (InterruptedException e) {e.printStackTrace();}
		timer.cancel();
	}
	
	public static TimerTask createNewTask() {
		return new TimerTask() {
			public void run() {
				doSomething();
			}
		};
	}
	
	private static void doSomething() {
		System.out.println("I have to do something!");
	}
Die statische Methoden sind nur zur Demo bitte nicht übernehmen, sondern das ganze an einem Objekt realisieren.
 

Marco7757

Aktives Mitglied
Leider verstehe ich die Lösung noch nicht ganz.

Was genau soll diese künstliche Pause simulieren? Was für Events?

Kann ich cancel und purge auch in der run()-Methde aufrufen, um jede Sekunde zu prüfen, ob schon ein neuer Task gestartet werden muss (mit schnellerer Zeit)?

Also das Problem ist ja, dass ich nicht weiss, wann ich die neue Zeit setzen muss. Ich muss also die ganze Zeit prüfen, ob es schon so weit ist ... wie kann ich das erreichen?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Was genau soll diese künstliche Pause simulieren? Was für Events?
Du musst ja aufgrund irgend eines Ereignisse den Task wechseln z.B. Level/Zeit ist um.
Die Verzögerung mit sleep() habe ich reingebaut, damit man bei der Demo auch mitbekommt, dass eine neue TimerTask gestartet wurde, sonst würde ja die erste gestartet und gleich wieder beendet.
Kann ich cancel und purge auch in der run()-Methde aufrufen, um jede Sekunde zu prüfen, ob schon ein neuer Task gestartet werden muss (mit schnellerer Zeit)?
ja sicher wenn die entsprechenden Objekte innerhalb der Methode bekannt sind.
 

Marco7757

Aktives Mitglied
Okay. Soweit klar.

Aber wie überprüfe ich jetzt, ob ich den neuen Task schon setzen muss?
Ich habe es mit einem zweiten Timer versucht, der einfach nur prüft, ob der erste Timer den Task schon wechseln muss. Wenn ja, übernimmt er das gleich. Wenn nicht, tut er nichts.
Das Problem ist allerdings, dass ich innerhalb einer inneren Klasse (TimerTask) nicht auf eine "nicht-finale" (Eclipse) Variable (task) zugreifen kann, um diese zu beenden und neu zu besetzen. Und wenn ich sie final mache, dann ist sie eben final und kann nicht mehr geändert werden ...
Wie lässt sich das umgehen?

Java:
final Timer timer = new Timer();
	    TimerTask task = createNewTask();
	    timer.schedule(task, 1000, points.getLevelSpeed());
		
	    Timer proofTimer = new Timer();
	    TimerTask proofTask = new TimerTask() {
	    	public void run() {
	    		if(levelSpeed<points.getLevelSpeed()) {
					//Levelspeed wird erhöht
					levelSpeed = points.getLevelSpeed();
					tetris.newTask = true;
				}
	    		
	    		if(tetris.newTask==true) {
	    			//Neuer Task für ersten Timer muss gesetzt werden
	    			task.cancel();
	    			timer.purge();
	    		    task = createNewTask();
	    	        timer.schedule(task, 1000,100);
	    		}
	    	}
	    };
 

Michael...

Top Contributor
Man kann auch ohne anonyme innere Klasse arbeiten ;-) oder in der run() einfach nur eine andere Methode aufrufen (so ähnlich wie in meinem Bsp) die zu einem Objekt gehört, welches auch Zugriff auf die Variable hat.
 

Marco7757

Aktives Mitglied
Deine Methode von oben greift aber auch nicht auf die Variable zu, sondern füllt sie einfach ...
Ich steh auf dem Schlauch. Wie arbeitet man "ohne anonyme Klasse"?
 

Michael...

Top Contributor
Wie arbeitet man "ohne anonyme Klasse"?
Indem man eine eigene Klasse schreibt, die das benötigte Interface implementiert oder von der Klasse erbt, deren Methode man überschreibt.

Unabhängig davon, hier mal ein Beispiel. Über einen TimerTask (ChangeTask) wird alle 3 sec ein aktiver TimerTask abbgebrochen und ein neuer mit einer kürzeren Periode gestartet.
Java:
import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskDemo {
	private Timer timer;
	
	public void startDemo() {
		timer = new Timer();
		timer.schedule(new ChangeTask(), 0, 3000);
	}	
	
	public static void main(String[] args) {
		new TimerTaskDemo().startDemo();
	}
	
	class MyTask extends TimerTask {
		public long l;
		
		public MyTask(long l) {
			this.l = l;
		}
		
		public void run() {
			System.out.println("blub " + l);
		}
	}
	
	class ChangeTask extends TimerTask {
		private int i=0;
		private long[] periods = {1000, 500, 250, 125};
		private TimerTask task;
		
		public void run() {
			if (i>=periods.length)
				timer.cancel();
			else {
				if (task!=null)
					task.cancel();
				task = new MyTask(periods[i]);
				timer.purge();
				timer.schedule(task, 0, periods[i]);
				i++;
			}
		}
	}
}
 

Marco7757

Aktives Mitglied
Okay, ich habs nun geschafft, indem ich die Variable task in meiner main-Klasse für alle Methoden zugänglich gemacht habe (public). Läuft ganz gut. Wahrscheinlich nicht der beste Stil, aber die Hauptsache ist, dass es endlich läuft ...

Danke für die Hilfe!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Timer vs ExecutorService: jeden Sonntag um 14.00 Uhr einen Task starten..? Java Basics - Anfänger-Themen 1
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
E multiple Timer die sich nicht summieren Java Basics - Anfänger-Themen 12
Jan_x8 Timer/Scanner Java Basics - Anfänger-Themen 5
C Timer aktualisieren Java Basics - Anfänger-Themen 5
L GUI- wie cancel ich einen Timer? Java Basics - Anfänger-Themen 10
missy72 Timer oder Timeline Java Basics - Anfänger-Themen 3
R Timer Format: 00:00:00 Java Basics - Anfänger-Themen 29
C java.util Timer läuft zu langsam? Java Basics - Anfänger-Themen 1
D Änder der Timer Speeds Java Basics - Anfänger-Themen 1
E Timer trotz erwartender Eingabe durchlaufen lassen Java Basics - Anfänger-Themen 11
L Methoden Timer Java Basics - Anfänger-Themen 9
J Memory-Spiel Aktivierung der Methode mit Timer Java Basics - Anfänger-Themen 44
G Animation Timer Nano Time Java Basics - Anfänger-Themen 2
S Timer reseten Java Basics - Anfänger-Themen 3
T Timer stoppt zu früh Java Basics - Anfänger-Themen 7
CptK Methoden Timer & Mathematischer Denkfehler Java Basics - Anfänger-Themen 7
mobaer Swing Timer stoppen Java Basics - Anfänger-Themen 3
C Wie erstellt man einen Timer/Delay? Java Basics - Anfänger-Themen 1
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
D Timer programmieren Java Basics - Anfänger-Themen 13
N Timer funktioniert nicht beim starten Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
J Timer richtig pausieren Java Basics - Anfänger-Themen 2
E Timer erstellen Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
S actionlistener timer Java Basics - Anfänger-Themen 9
C Wie kann ich jetzt von der Game.java auf die Timer.java zugreifen? Java Basics - Anfänger-Themen 6
S timer mit imagedatei Java Basics - Anfänger-Themen 5
S timer Java Basics - Anfänger-Themen 0
V Java Uitil Timer Stoppt nicht Java Basics - Anfänger-Themen 2
KaffeeFan Timer beenden Java Basics - Anfänger-Themen 12
K Ampelsteuerung mit Timer Java Basics - Anfänger-Themen 8
F Array und Timer Java Basics - Anfänger-Themen 2
G Timer einsetzen Java Basics - Anfänger-Themen 2
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
W Erste Schritte Timer soll jede Sekunde Label aktualisieren Java Basics - Anfänger-Themen 5
T Timer - HILFE Java Basics - Anfänger-Themen 10
O Alternative zum swing-Timer Java Basics - Anfänger-Themen 5
A Wieso funktioniert dieser Timer nicht?? Java Basics - Anfänger-Themen 3
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
O Laufender Timer+Action Listener in Thread VS isAlive() Java Basics - Anfänger-Themen 4
O Starte Timer, während anderer Timer noch läuft. Ruft dies Schwierigkeiten hervor? Java Basics - Anfänger-Themen 0
M Schneller Timer Java Basics - Anfänger-Themen 2
C Timer aus anderer Klasse stoppen/starten Java Basics - Anfänger-Themen 3
B Timer beenden? Java Basics - Anfänger-Themen 0
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
O Delayed Timer erstellen Java Basics - Anfänger-Themen 3
M Timer / Thread Java Basics - Anfänger-Themen 43
M Javax.swing - Timer(2 Button) Java Basics - Anfänger-Themen 17
J Timer - Swing Java Basics - Anfänger-Themen 5
A Timer: textarea.getText() mit Variable vergleichen Java Basics - Anfänger-Themen 3
D Problem mit Methode und Timer Java Basics - Anfänger-Themen 35
T Wie mache ich einen Timer der alle 2 sekunden aufgerufen wird? Java Basics - Anfänger-Themen 5
R Einfacher Timer geht nicht Java Basics - Anfänger-Themen 7
J Swing Timer Java Basics - Anfänger-Themen 3
M Einfacher Timer ;) Java Basics - Anfänger-Themen 15
M Timer für Termial-Eingaben Java Basics - Anfänger-Themen 3
C Methoden Einen Timer einbauen, aber wie? Java Basics - Anfänger-Themen 5
B Timer Java Basics - Anfänger-Themen 25
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
S Erste Schritte Java Timer Java Basics - Anfänger-Themen 13
E Threads Timer Java Basics - Anfänger-Themen 6
Spin KI Anfänger Frage : Timer Problem Java Basics - Anfänger-Themen 6
F Prüfen ob timer läuft Java Basics - Anfänger-Themen 6
L Erste Schritte Timer und Zugriffsattribute Java Basics - Anfänger-Themen 5
M Audio + Timer Java Basics - Anfänger-Themen 12
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
R Klassen MemorySpiel: brauche Timer Java Basics - Anfänger-Themen 3
D Timer in Applet Java Basics - Anfänger-Themen 2
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
F Java Timer Frage Java Basics - Anfänger-Themen 14
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
B Timer Java Basics - Anfänger-Themen 2
S timer task problem Java Basics - Anfänger-Themen 2
C Überprüfen, ob Timer läuft Java Basics - Anfänger-Themen 3
S "Kleines" Problem mit dem Timer Java Basics - Anfänger-Themen 4
Luk10 Problem mit vielen Timer(-Events) Java Basics - Anfänger-Themen 17
Luk10 Swing timer und Threads Java Basics - Anfänger-Themen 4
W Timer erstellen Java Basics - Anfänger-Themen 2
M Timer unterbrechen? Wo ist mein Thread? Java Basics - Anfänger-Themen 2
L Timer innerhalb eines Threads Java Basics - Anfänger-Themen 3
P Java Timer Java Basics - Anfänger-Themen 2
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
B problem mit timer/timertask, Farbverlauf Java Basics - Anfänger-Themen 10
Piwi Timer bei Programmende beenden Java Basics - Anfänger-Themen 25
T zweiter Timer überschreibt den ersten Timer ? Java Basics - Anfänger-Themen 5
kulturfenster Problem mit javax.swing.Timer Java Basics - Anfänger-Themen 2
C Regelmäßigen Timer bei Zeitüberschreitung nacheinander abarbeiten Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
J timer Java Basics - Anfänger-Themen 2
H Timer Java Basics - Anfänger-Themen 3
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
G Klasse mit Timer nicht beenden Java Basics - Anfänger-Themen 6
S Timer / TimerTask Frage Java Basics - Anfänger-Themen 8
S Timer bzw. TimerTask Frage Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben