Java Warteschlange

1Raini

Neues Mitglied
Guten Abend,
Ich stehe gerade vor dem Problem das mein Programm eine bestimmte Funktion spammen kann, was ich nicht will.
Ich möchte eine Warteschlange erstellen, wo die Dinge rein kommen die ich da hinzufüge. Wenn ein Spieler beispielsweise ein Button drückt, landet das in der Warteschlange und wird ausgeführt, sobald diese Warteschlange fertig ist (mit einem Abstand von 3 Sekunden).
Beispiel:
User drückt 5x auf den Knopf. Alle 5x landen in der Warteschlange. Position 1 wird ausgeführt und dann soll 3 Sekunden gewartet werden bis die nächste Position ausgeführt werden soll. Es soll eine Funktion in die Warteschlange!

Hat da jemand eine Idee, wie ich das mache?

Liebe Grüße und einen schönen Abend noch!
 
Wenn du das selbst implementiern möchtest (statt die von @mihe7 vorgeschlagene Klasse zu benutzen), kannst du natürlich auch eine Liste von auszuführenden Befehlen einführen.
Sobald auf einen Button geklickt wird, wird in diese Liste ein Befehl eingefügt.
Und alle drei Sekunden wird (von einem anderen Thread) ein Befehl aus dieser Liste ausgeführt.
 
Kannst ja mal mit java.util.Queue und "Runnable" versuchen.

Anmerkung: bin mir bei dem Namen "Runnable" nicht sicher. Man konnte zumindest mit dem Objekt, dass ich meine, einen Code ausführen lassen, der nach Ausführung die gewünschte Zeit wartet, bis dein restlicher Code ausgeführt wird.
Z.B. wurde er wie folgt benutzt:
Java:
public void main(){
    irgendwas = new Runnable(){
        Log.i("Test","Führt Code in der geschweiften Klammer aus, dann was nach dieser kommt.");
        // tu noch irgendwas...
    , duration = 10}; //duration in ms
   
    Log.i("Rest","Nach 10ms wird dieser Befehl ausgeführt");
}
(Kann mich leider nicht genau erinnern wie das Objekt hieß - vllt kann es ja anhand meines "Musters" hier jemand identifizieren 😀)
 
Kannst ja mal mit java.util.Queue und "Runnable" versuchen.

Anmerkung: bin mir bei dem Namen "Runnable" nicht sicher. Man konnte zumindest mit dem Objekt, dass ich meine, einen Code ausführen lassen, der nach Ausführung die gewünschte Zeit wartet, bis dein restlicher Code ausgeführt wird.
Z.B. wurde er wie folgt benutzt:
Java:
public void main(){
    irgendwas = new Runnable(){
        Log.i("Test","Führt Code in der geschweiften Klammer aus, dann was nach dieser kommt.");
        // tu noch irgendwas...
    , duration = 10}; //duration in ms
  
    Log.i("Rest","Nach 10ms wird dieser Befehl ausgeführt");
}
(Kann mich leider nicht genau erinnern wie das Objekt hieß - vllt kann es ja anhand meines "Musters" hier jemand identifizieren 😀)
Ein ziemliches Kauderwelsch dein Code.
Ich denke du meist einen Handler.
 
Es soll eine Funktion in die Warteschlange!
Wie bereits geantwortet wurde, kann man die Funktionsobjekte in eine java.util.Queue packen.

An der Vererbungshierarchie sieht man, dass man eine Queue auch mit einer ArrayList realisieren kann.

Die Funktionsobjekte sollten ein Interface/Oberklasse implementieren, die eine execute-Methode hat:

[CODE lang="java" title="Step mit Interface"]interface MyExecutable {

void execute(MyStepData);
}

class ExampleStep implements MyExecutable {

public void execute(MyStepData) {
...step code...
}

}

// die Warteschlange
Queue<MyExecutable> queue = new Queue();

// die Daten (der Kontext)
MyStepData stepData = new MyStepData();

// die Verarbeitungs-Schleife
while (! queue.isEmpty()) {
MyExecutable step = queue.take(); // hier musst Du mal gucken, ich habe das genaue API nicht im Kopf

step.execute(stepData);

Thread.sleep( 3000 ); // 3 Sekunden warten
}
[/CODE]

Irgendwo (wahrscheinlich in einem anderen Thread) werden dann die Step(Funktions)-Objekte in die Queue gepackt.

Entspricht wahrscheinlich teils dem Command-Pattern, nur ohne Undo-Redo.

So könntest Du es machen.

Also:

Step(Funktions)-Interface

Step(Funktions)-Klassen

Queue

Kontext-Objekt (wirst Du wahrscheinlich brauchen, Spiel-Status)

Code zum Hinzufügen der Step(Funktions)-Objekte zur Queue

Abarbeitungs-Schleife
 
Ein ziemliches Kauderwelsch dein Code.
Ich denke du meist einen Handler.
Wie bereits erwähnt ist das nur ein Muster wie man Runnable /(oder wie auch immer das hieß) benutzt.
Es handelt sich da auch nicht um ein Code. Hatte nur gehofft, dass anhand des Musters jemand erkennt wie das Objekt
wirklich hieß & genau verwendet wird. 😀

Hatte das mal hinsichtlich des Bluetooth LE Scan Verfahrens gesehen.
 
Wie bereits erwähnt ist das nur ein Muster wie man Runnable /(oder wie auch immer das hieß) benutzt.
Es handelt sich da auch nicht um ein Code. Hatte nur gehofft, dass anhand des Musters jemand erkennt wie das Objekt
wirklich hieß & genau verwendet wird. 😀

Hatte das mal hinsichtlich des Bluetooth LE Scan Verfahrens gesehen.
Was du meinst ist sicherlich das.


Ein Handler der verzögert gestartet wird. Besser gesagt seine runnable die run Methode im Abstand der angehen Zeit immer wider ausführt.
 
Für mich ist der Hauptunderscheid das der Code bei einem Handler in dem UI (main) Thread ausgeführt wird.
Bei Timer in einem TimerTask. Was ein neuer andere Thread ist.
 
Für mich ist der Hauptunderscheid das der Code bei einem Handler in dem UI (main) Thread ausgeführt wird.
Bei Timer in einem TimerTask. Was ein neuer andere Thread ist.
Aber dazu gibt es dann in den jeweiligen UI Frameworks auch in der Regel entsprechende Klassen.
Swing: javax.swing.Timer -> https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html
JavaFX: javafc.animation.timeline -> https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Timeline.html
SWT: Display.timerExec -> https://download.eclipse.org/rt/rap/doc/3.1/guide/reference/api/org/eclipse/swt/widgets/Display.html

Ich wüsste (auch aus anderen Sprachen) eigentlich kein UI Framework, dass dies nicht bieten würde.
 
Mir ist noch eingefallen, dass die Ereignis-Abarbeitungs-Schleife eigentlich endlos laufen sollte.

Also while(true)

Irgenwo kann/sollte es natürlich einen Ausgang aus der App geben return.

Wenn die Queue leer ist muss die Schleife eben etwas idlen:

if (queue.isEmpty()) {Thread.sleep(xxx); continue;}
Einfach die richtige Queue nehmen und man muss sich um nichts davon Gedanken machen 😉
 

Zurück
Oben