Brauche hilfe bei Java?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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:

  1. Eine TimerTask
  2. Anzahl Millisekunden vor der ersten Ausführung
  3. Anzahl Millisekunden zwischen allen weiteren Ausführungen

Die Einheit dabei ist Millisekunden, 5*1000ms = 5 Sekunden.

Woher ich das weiß:Studium / Ausbildung

Yoshi32  31.07.2021, 22:46

Ist Timer nicht aus dem letzten Jahrhundert?

0
malte314  01.08.2021, 10:38
@Yoshi32

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);
1
Mythxx103 
Beitragsersteller
 31.07.2021, 21:25

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...

1
malte314  31.07.2021, 21:28
@Mythxx103

Das heißt dein Problem ist nicht die periodischen Ausführung sondern das persistente Speichern?

0

Arbeitest du mit Threads? Kennst du dich da aus?


Mythxx103 
Beitragsersteller
 31.07.2021, 21:16

Sorry, kenne mich da garnicht aus :/ weiß garnicht was nicht ma, was ein Thread ist

0
gogogo  31.07.2021, 21:22
@Mythxx103

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.

1
Mythxx103 
Beitragsersteller
 31.07.2021, 21:27
@gogogo

Danke, probiere das nachher mal aus!

0
Mythxx103 
Beitragsersteller
 01.08.2021, 14:58
@gogogo

Wie aktiviere ich implements runnable?

0
gogogo  01.08.2021, 15:58
@Mythxx103

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.

0