multiple Timer die sich nicht summieren

EricB2

Mitglied
Hallo und guten tag,
schon mehrfach bin ich über das Problem gestolpert dass ich mehrere Methoden unterschiedlich zeitverzögert ausführen möchte die Zeitverzögerung sich jedoch summiert. Dazu ein kleines Beispiel:
In der Klasse RandomChar wird der Variablen "hunger" ein beliebiger Wert gegeben. Dieser erhöht sich jede Sekunde (Thread.sleep(1000)) um +1 und der Wert würd sekündlich ausgegeben. Mein Bestreben ist es nun über die Klasse.Methode "Minus.hunger" der Variablen "hunger" alle 5 Sekunden wieder vier abzuziehen jedoch arbeitet das Programm die Anweisungen nacheinander ab so dass ich die Werte nicht mehr sekündlich sondern alle sechs Sekunden ausgegeben bekomme. kann man die Methoden irgendwie parallel arbeiten lassen?

Java:
public class RandomChar {

    static int hunger = ZufallsZahl.zwischen(1, 100);
    static int durst = ZufallsZahl.zwischen(1, 100);
    static int zeit = ZufallsZahl.zwischen(1, 100);
    static int budget = ZufallsZahl.zwischen(1, 100);
    static int stimmung =ZufallsZahl.zwischen(1, 100);
    
    public static void main(String[] args) throws InterruptedException {
        
        
        for(int k=0; 60<61; k++) {

            
        hunger = Minus.hunger(hunger);   
            
        System.out.println("Hunger: " + hunger);
        System.out.println("Durst: " + durst);
        System.out.println("Zeit: " + zeit);
        System.out.println("Budget: " + budget);
        System.out.println("Stimmung: " + stimmung);
        
        hunger = hunger +1;
        System.out.println("Hunger später: " + hunger);
        
        durst = durst + 20;
        System.out.println("Durst später: " + durst);
        System.out.println("\n");
        
        
        Thread.sleep(1000);
        
        }
        
    }

}





class ZufallsZahl {

    public static int zwischen(int untereGrenze, int obereGrenze) {
        int differenz = obereGrenze - untereGrenze;
        int zufallZahlMath = (int) (Math.random() * differenz) + untereGrenze;
        
        return zufallZahlMath;
    }

}



class Minus {
    
    public static int hunger(int hunger) throws InterruptedException {
        
        hunger = hunger - 4;
        Thread.sleep(5000);
        
        return hunger;
    }
    
}
 

EricB2

Mitglied
Ja eine Endlosschleife war in diesem Fall erwünscht. Danke schonmal für diesen Tipp ;) an dem anderen Problem bin ich immernoch dran....
 

KonradN

Super-Moderator
Mitarbeiter
Hast du Dir mal Timer angesehen? Damit könntest Du arbeiten. Dann würdest du ggf auch keine Endlosschleife mehr benötigen, weil das der Timer machen würde.

Die Idee ist halt, dass du sozusagen Eventbasiert entwickelst. Du hast dann Methoden, die alle x Sekunden aufgerufen werden sollen:
Möglichkeit a) wäre, hier mit mehreren Timern zu arbeiten. Dann ist die Zeitspanne ganz individuell.
B) du kannst aber auch nur einen Timer haben, der jede Sekunde etwas macht. Für jede Aufgabe gibt es eine Zeitspanne und eine Wartezeit. Wartezeit wird dann jedes Mal um eins erhöht: wenn Wartezeit = Zeitspanne, dann wird die Aufgabe ausgeführt und die Wartezeit auf 0 gesetzt.
Man kann das auch mischen: man kann mehrere Timer haben um dann Dinge aufzuteilen. Wenn du Dinge hast, die im Minuten oder Stunden Bereich liegen, dann musst du ja nicht bis 7200 zählen sondern könntest in einem Stunden-Timer nur bis 2 zählen.

Ein weiterer Punkt ist bei sowas auch immer die Laufzeit: dein Spiel will jede Sekunde irgendwas machen - was ist, wenn dies länger dauert als 1s? Sowas sollte man ggf auch bedenken.
 

EricB2

Mitglied
Ok also inzwischen habe ich mit dem was ich aus der TimerKlasse heraus verstanden habe etwas zusammengebastelt was dem entspricht was ich mir vorstelle aber macht das auch Sinn?

Java:
import java.util.Timer;
import java.util.TimerTask;

public class RandomChar {

    static int hunger = ZufallsZahl.zwischen(1, 100);
    static int durst = ZufallsZahl.zwischen(1, 100);
    static int zeit = ZufallsZahl.zwischen(1, 100);
    static int budget = ZufallsZahl.zwischen(1, 100);
    static int stimmung =ZufallsZahl.zwischen(1, 100);
    
    public static void main(String[] args) throws InterruptedException {
        
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
                public void run() {
        
                    System.out.println("Hunger: " + hunger);
                    System.out.println("Durst: " + durst);
                    System.out.println("Zeit: " + zeit);
                    System.out.println("Budget: " + budget);
                    System.out.println("Stimmung: " + stimmung);
                    
                    
                    
                }
         };
        
         timer.scheduleAtFixedRate(task,0, 1000);    //führt den TimerTask aus und zwar nach 0 Millis und wiederholt ihn nach 1000 Millis
        
        
        
        TimerTask task2 = new TimerTask() {
            public void run() {
    
                hunger = Minus.hunger(hunger);        // die Variable "hunger" bekommt einen neuen Wert indem sie an die Klasse.Methode Minus.hunger() übergeben und verändert wird
                durst = Minus.durst(durst);           
            }
        };
    
        timer.scheduleAtFixedRate(task2,4000, 4000);
        
    
    
    }
}





class ZufallsZahl {

    public static int zwischen(int untereGrenze, int obereGrenze) {
        int differenz = obereGrenze - untereGrenze;
        int  zufallZahlMath = (int) (Math.random() * differenz) + untereGrenze;
        
        return zufallZahlMath;
    }
}



class Minus {
    public static int  hunger(int  hunger) {
        
        hunger = hunger - 1;
        return hunger;                        //gibt den neuen Wert für "hunger" an den Absender zurück

    }

    public static int  durst(int  durst) {
        
        durst = durst - 3;
        return durst;

    }
}
 

EricB2

Mitglied
Hast du Dir mal Timer angesehen? Damit könntest Du arbeiten. Dann würdest du ggf auch keine Endlosschleife mehr benötigen, weil das der Timer machen würde.

Die Idee ist halt, dass du sozusagen Eventbasiert entwickelst. Du hast dann Methoden, die alle x Sekunden aufgerufen werden sollen:
Möglichkeit a) wäre, hier mit mehreren Timern zu arbeiten. Dann ist die Zeitspanne ganz individuell.
B) du kannst aber auch nur einen Timer haben, der jede Sekunde etwas macht. Für jede Aufgabe gibt es eine Zeitspanne und eine Wartezeit. Wartezeit wird dann jedes Mal um eins erhöht: wenn Wartezeit = Zeitspanne, dann wird die Aufgabe ausgeführt und die Wartezeit auf 0 gesetzt.
Man kann das auch mischen: man kann mehrere Timer haben um dann Dinge aufzuteilen. Wenn du Dinge hast, die im Minuten oder Stunden Bereich liegen, dann musst du ja nicht bis 7200 zählen sondern könntest in einem Stunden-Timer nur bis 2 zählen.

Ein weiterer Punkt ist bei sowas auch immer die Laufzeit: dein Spiel will jede Sekunde irgendwas machen - was ist, wenn dies länger dauert als 1s? Sowas sollte man ggf auch bedenken.

ich hoffe dass was in dem gerade geposteten Code ersichtlich ist entspricht dem was Sie in ihrer Variante "a" beschrieben haben.
Könnten Sie vielleicht trotzdem etwas genauer auf Variante "b" eingehen? Wie das aussehen kann ist mir nicht ganz klar.
 

KonradN

Super-Moderator
Mitarbeiter
Also vom Aufbau her wirkt Dein Code relativ wirr. Was ist denn Minus für eine Klasse? Ist erst einmal nur eine Utility Klasse, hat also nur irgendwelche statischen Methoden. Und da sind dann Methoden hunger und durst und beide nehmen einen int und geben ein int zurück? Was erwartest Du von so einer Methode?

Dann hast Du eine Klasse RandomChar - was ist ein RandomChar? Wenn Du ein Spiel schreibst und Du da Spielfiguren hast, dann kann das eine Klasse Character sein. Diese hat gewisse Eigenschaften. Und dann kann es von mir aus eine Methode geben, die einen zufälligen Chaarcter erzeugt.

Java:
public class Character {

  public static Character createRandom() {
    // ...
  }

}

Gehört zu Character eine main Methode? Oder ein Timer? Doch eher nicht, oder?

Da könnte aber eine regelmäßige Aktion dazu gehören. In Spielen spricht man oft von einem Heartbeat. Da schlägt also sowas wie ein Herz.

Also machen wir ein Interface Heartbeat das dann von mir aus nur eine Methode heartbeat() hat. Character implementiert dann Heartbeat.

Und dann haben wir irgendwo einen Timer für ein Heartbeat. Also eine Klasse HeartbeatTimer oder so. Diese hat dann intern einen Timer, der regelmäßig eine Methode auslöst und hat eine Liste von Heartbeat Instanzen. Immer wenn der Timer auslöst, dann wird für jede Heartbeat Instanz heartbeat aufgerufen.

Dann hast Du in Character also den Heartbeat. Der wird regelmäßig ausgeführt (jede Sekunde). Jetzt soll aber etwas nur alle 5 Sekunden laufen. Also hast Du dann in der Klasse einfach einen Counter. In heartbeat() kannst Du den erhöhen: counter++; Wenn counter == 5 ist, dann machst Du die Aktion, die alle 5 Sekunden ausgeführt werden soll und setzt counter wieder auf 0.

==> Ein einziger Timer, der dann für alle Heartbeat instanzen auf einmal benutzt werden kann. Und Du hast eine Lösung, wie in einer Instanz etwas ausgelassen wird.

Diese Funktionalität kann man natürlich auch zentral packen. Du kannst ja einen TenSecondsTimer bauen. Dieser implementiert Heartbeat, hat eine Liste mit Dingen, die aufgerufen werden sollen (alle 10 Sekunden) und hat dann intern die eben angesprochene Mechanik: Wenn bis 10 gezählt wurde, wird der Zähler auf 0 gesetzt und alle Aufrufe in der Liste werden ausgeführt ... Es kann also dafür zentrale Instanzen geben, die sowas machen.

Generell sollte man sich das immer gut vorstellen. Stell Dir vor, das sind kleine Gnome. Du hast den Timer Gnom. Der kann also zu bestimmten Zeiten immer etwas machen. Den "Timer" Gnom brauchst Du um Deinem "HeartbeatTimer" Gnom jede Sekunde Bescheid zu sagen.... Durch so eine visuelle Vorstellung, bei der die Instanzen sozusagen lebending werden und sich Nachrichten schicken kommst Du evtl. zu besser geschnittenen Klassen.
 

EricB2

Mitglied
Also vom Aufbau her wirkt Dein Code relativ wirr. Was ist denn Minus für eine Klasse? Ist erst einmal nur eine Utility Klasse, hat also nur irgendwelche statischen Methoden. Und da sind dann Methoden hunger und durst und beide nehmen einen int und geben ein int zurück? Was erwartest Du von so einer Methode?

Dann hast Du eine Klasse RandomChar - was ist ein RandomChar? Wenn Du ein Spiel schreibst und Du da Spielfiguren hast, dann kann das eine Klasse Character sein. Diese hat gewisse Eigenschaften. Und dann kann es von mir aus eine Methode geben, die einen zufälligen Chaarcter erzeugt.

Java:
public class Character {

  public static Character createRandom() {
    // ...
  }

}

Gehört zu Character eine main Methode? Oder ein Timer? Doch eher nicht, oder?

Da könnte aber eine regelmäßige Aktion dazu gehören. In Spielen spricht man oft von einem Heartbeat. Da schlägt also sowas wie ein Herz.

Also machen wir ein Interface Heartbeat das dann von mir aus nur eine Methode heartbeat() hat. Character implementiert dann Heartbeat.

Und dann haben wir irgendwo einen Timer für ein Heartbeat. Also eine Klasse HeartbeatTimer oder so. Diese hat dann intern einen Timer, der regelmäßig eine Methode auslöst und hat eine Liste von Heartbeat Instanzen. Immer wenn der Timer auslöst, dann wird für jede Heartbeat Instanz heartbeat aufgerufen.

Dann hast Du in Character also den Heartbeat. Der wird regelmäßig ausgeführt (jede Sekunde). Jetzt soll aber etwas nur alle 5 Sekunden laufen. Also hast Du dann in der Klasse einfach einen Counter. In heartbeat() kannst Du den erhöhen: counter++; Wenn counter == 5 ist, dann machst Du die Aktion, die alle 5 Sekunden ausgeführt werden soll und setzt counter wieder auf 0.

==> Ein einziger Timer, der dann für alle Heartbeat instanzen auf einmal benutzt werden kann. Und Du hast eine Lösung, wie in einer Instanz etwas ausgelassen wird.

Diese Funktionalität kann man natürlich auch zentral packen. Du kannst ja einen TenSecondsTimer bauen. Dieser implementiert Heartbeat, hat eine Liste mit Dingen, die aufgerufen werden sollen (alle 10 Sekunden) und hat dann intern die eben angesprochene Mechanik: Wenn bis 10 gezählt wurde, wird der Zähler auf 0 gesetzt und alle Aufrufe in der Liste werden ausgeführt ... Es kann also dafür zentrale Instanzen geben, die sowas machen.

Generell sollte man sich das immer gut vorstellen. Stell Dir vor, das sind kleine Gnome. Du hast den Timer Gnom. Der kann also zu bestimmten Zeiten immer etwas machen. Den "Timer" Gnom brauchst Du um Deinem "HeartbeatTimer" Gnom jede Sekunde Bescheid zu sagen.... Durch so eine visuelle Vorstellung, bei der die Instanzen sozusagen lebending werden und sich Nachrichten schicken kommst Du evtl. zu besser geschnittenen Klassen.
Ok danke dafür :) dann werde ich jetzt mal ein ganzes Stück zurückspuhlen und nochmal anders ansetzen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
JD_1998 Multiple Parametereingabe Java Basics - Anfänger-Themen 3
D [AES] input not multiple of 16 Java Basics - Anfänger-Themen 2
K RegEx - Multiple Line Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Multiple Clients and one Server Java Basics - Anfänger-Themen 2
x22 Java Multiple Choice Test Java Basics - Anfänger-Themen 8
Dogge Multiple markers at line 15 Java Basics - Anfänger-Themen 13
U [Problem] Handling multiple frames Java Basics - Anfänger-Themen 5
P Threads Multiple Dialogboxen Java Basics - Anfänger-Themen 6
G Multiple Leerzeichen entfernen Java Basics - Anfänger-Themen 13
J String zu Double parsen (multiple points) Java Basics - Anfänger-Themen 2
H Multiple Markers at this line Java Basics - Anfänger-Themen 3
S Threads Handling multiple different Threads Java Basics - Anfänger-Themen 7
H Multiple Fileaccess - sync? Java Basics - Anfänger-Themen 7
H Multiple JFrames im GUI Editor von NetBeans Java Basics - Anfänger-Themen 2
S jList Multiple Selection mit Klick Java Basics - Anfänger-Themen 2
C Multiple Choice Test Java Java Basics - Anfänger-Themen 5
T Multiple BufferedImage Java Basics - Anfänger-Themen 3
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
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

Ähnliche Java Themen

Neue Themen


Oben