Brauche hilfe bei Java?
Wie kann ich bei Java machen das mein Spielstand alle 5 Sekunden gespeichert wird?
2 Antworten
![](https://images.gutefrage.net/media/user/malte314/1641413636271_nmmslarge__0_0_225_225_e90e21b3d3b0fa1d33f6e3dda80170d9.jpg?v=1641413636000)
Mit der minimalen Informationsfülle, die Du uns gegeben hast, ist nicht viel anzufangen. Wenn Du aber einfach eine Methode hast, die den Spielstand speichert und du nur wissen willst, wie Du diese Methode alle 5 Sekunden aufrufen kannst - Das geht zum Beispiel mit einem Timer: (Gehen wir davon aus, du hast die Methode "speichern" des Objektes "spiel")
import java.util.Timer;
// ...
new Timer("game-saver").schedule(new TimerTask() {
@Override
public void run() {
spiel.speichern();
}
}, 0, 5*1000);
Die drei Parameter sind in gleicher Reihenfolge:
- Eine TimerTask
- Anzahl Millisekunden vor der ersten Ausführung
- Anzahl Millisekunden zwischen allen weiteren Ausführungen
Die Einheit dabei ist Millisekunden, 5*1000ms = 5 Sekunden.
![](https://images.gutefrage.net/media/user/malte314/1641413636271_nmmslarge__0_0_225_225_e90e21b3d3b0fa1d33f6e3dda80170d9.jpg?v=1641413636000)
Offensichtlich übertreibst du ein bisschen und Timer ist aus 1.3, aber die Dokumentation sagt folgendes:
Java 5.0 introduced the java.util.concurrent package and one of the concurrency utilities therein is the ScheduledThreadPoolExecutor which is a thread pool for repeatedly executing tasks at a given rate or delay. It is effectively a more versatile replacement for the Timer/TimerTask combination, as it allows multiple service threads, accepts various time units, and doesn't require subclassing TimerTask (just implement Runnable). Configuring ScheduledThreadPoolExecutor with one thread makes it equivalent to Timer.
Die Antwort von dir ist also tatsächlich besser, vor allem weil sie keine unnötige "TimerTask" Instanz benötigt:
ScheduledExecutorService.
scheduleAtFixedRate(spiel::speichern, 0, 5,
TimeUnit.SECONDS);
![](https://images.gutefrage.net/media/user/Mythxx103/1689962879499_nmmslarge__0_0_809_810_b9635caabee19d9b568b156fe55e60ca.jpg?v=1689962880000)
Hi, das hier ist der Code, wennn es dir hilft :
package com.company;
import javax.swing.*;
import java.util.*;
import java.util.Timer;
public class Pocket {
public static void main(String[] args) {
int standartballAnzahl = 0;
int superballAnzahl = 0;
int hyperballAnzahl = 0;
int himmibeerAnzahl = 0;
int nanabeerAnzahl = 0;
int goldenehimmibeerAnzahl = 0;
String standartball = JOptionPane.showInputDialog("Deine Standartball-Anzahl beträgt : " + standartballAnzahl);
String superball = JOptionPane.showInputDialog("Deine Superball-Anzahl beträgt : " + superballAnzahl);
String hyperball = JOptionPane.showInputDialog("Deine Hyperball-Anzahl beträgt : " + hyperballAnzahl);
String himmibeere = JOptionPane.showInputDialog("Deine Himmibeer-Anzahl beträgt : " + himmibeerAnzahl);
String nanabeere = JOptionPane.showInputDialog("Deine Nanabeeren-Anzahl beträgt : " + nanabeerAnzahl);
String goldeneHimmibeere = JOptionPane.showInputDialog("Deine goldenenhimmibeer-Anzahl beträgt : " + goldenehimmibeerAnzahl);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
String himmibeere = JOptionPane.showInputDialog("Deine Himmibeer-Anzahl beträgt : " + himmibeerAnzahl + 1);
}
}, 1000*60, 1000*60);
}
Ich weiß, ist ziemlicher Kinder-Code, wollte es simpel haben... Wie ganz unten zu sehen ist, möchte ich, dass man jede Minute eine "Himmibeere" bekommt. Aber das funktioniert auch irgendwie nicht richtig... Bleibt immer bei 1 stecken und auf 2 kommt man erst garnicht... Ich wollte, wenn das funktioniert, dass der Code bzw. der aktuelle "Spielstand" gespeichert wird. Heißt, wenn ich momentan 3 Himmibeeren habe und das Ding morgen nochma öffne, möchte ich wieder auf die 3 kommen...
![](https://images.gutefrage.net/media/user/malte314/1641413636271_nmmslarge__0_0_225_225_e90e21b3d3b0fa1d33f6e3dda80170d9.jpg?v=1641413636000)
Das heißt dein Problem ist nicht die periodischen Ausführung sondern das persistente Speichern?
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Arbeitest du mit Threads? Kennst du dich da aus?
![](https://images.gutefrage.net/media/user/Mythxx103/1689962879499_nmmslarge__0_0_809_810_b9635caabee19d9b568b156fe55e60ca.jpg?v=1689962880000)
Sorry, kenne mich da garnicht aus :/ weiß garnicht was nicht ma, was ein Thread ist
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
In einem Programm gibt es mindestens einen Thread. Der führt das Programm aus.
Ein Programm kann mehrere Threads haben, also zwei Ausführungen gleichzeitig. Der zweite Thread speichert alle 5 Sekunden die Daten.
Erstelle dazu eine Klasse MyClass mit 'implements Runnable' und einer Methode void run(); Diese führt das zweite aus.
MyClass inst = ....;
Thread:start( inst ) startet den Thread.
Es gibt aber weitere Bedingungen für Threadprogrammierung. Insbesondere beim Zugriff auf Daten aus mehr als einem Thread zur Zeit.
![](https://images.gutefrage.net/media/default/user/9_nmmslarge.png?v=1551279448000)
Keine Aktivierung.
Implements bedeutet, dass du alle Methoden eines Interfaces in der Methode mit seinen definierten Argumenten implementierst.
Runnable (nicht runnable) ist von Java schon definiert und hat nur eine Methode.
Wenn die Klasse
void run() {}
in der Klasse hast, ist alles fertig.
Ist Timer nicht aus dem letzten Jahrhundert?