2016-05-30 10 views
0

Ich bin ein Spiel zu schaffen, und ich bin in diesem Problem fest:Java Callback-Funktion oder statische Klasse

Ich habe die Klasse Spiel und im Spiel, habe ich die Küche. Wenn der Spieler zum Beispiel:/neues Ei ich tue: game.kitchen.newEgg()

Ich würde gerne wissen, was der beste Weg ist, und wie ich das Spiel benachrichtigen kann, dass das Ei fertig ist.

Ich habe versucht, die Klasse Spiel als statisch, aber es scheint nicht korrekt.

Ich habe auch versucht, alle 1 Sekunde, um das Spiel Call kitchen.isReady() (weder diese wie korrekt aussieht)

und mein letzter Versuch war ein Consumer wie folgt erstellen:

public class Kitchen { 
    public void newEgg(String name, Consumer<String> function){ 
     System.out.println("egg is in progress"); 
     try { 
      Thread.sleep(2000); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     function.accept(name); 
    } 
} 

und in der Spiel:

Alle Baummethoden arbeiteten, aber ist das der richtige Weg zu tun? Wie soll ich es machen? Was ist die beste Lösung für ein Spiel?

+0

Es ist noch unklar, was Ihre Absichten sind. Erwähnen Sie, dass es sich um gleichzeitige Programmierung handelt, und beschreiben Sie jede Ihrer aktiven Entitäten. –

+0

Sie rufen nirgendwo 'newEgg()' auf. Und wo ist 'ei.applyFunction()'? Und wo genau stecken Sie fest? – shmosel

+0

Ich habe die Methodennamen korrigiert. Es tut uns leid. @ E_net4: Ich habe den Motor (Spiel), der eine Küche enthält. Die Küche ist verantwortlich für das Ei. und wenn es fertig ist, möchte ich das Spiel aus einigen Gründen benachrichtigen (aktualisiere die Benutzerpunkte, verringere das Geld ... etc ...) Meine Frage ist: Was ist der beste Weg dazu? Einer meiner Vorschläge? andere Sache komplett anders? danke. –

Antwort

0

Die Meldung, dass ein asynchroner Job ausgeführt wird, wäre ein Job für eine CompletableFuture<V> (Java 8). Es ist wie ein Future<V>, nur Sie können zusätzliche Callbacks hinzufügen, die sofort nach Abschluss des Jobs ausgelöst werden.

Hier ist eine minimale Arbeitsbeispiel, dass Sie Ihre Game-Engine anpassen können:

import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class Example { 

    public static void main(String[] args) { 

     Example example = new Example(); 

     // Start generating a String 
     ExecutorService pool = Executors.newFixedThreadPool(4);  // We need some pool to run things async 
     CompletableFuture.supplyAsync(example::createString, pool) // run the creation job in another thread 
         .thenAccept(example::callback);   // run this callback when the job is done 
     pool.shutdown(); 

     // Doing something else in the meantime... 
     System.out.println("Meandering..."); 

    } 

    private String createString() { 
     artificialDelay(); 
     return "Hello World"; 
    } 

    private void callback(String input) { 
     System.out.println("Received this : " + input); 
    } 

    private void artificialDelay() { 
     try { 
      TimeUnit.SECONDS.sleep(2); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
+0

Hallo, danke für deine Antwort, es hat mir gefallen. aber warum ist es besser als meine Lösung mit 'Runnable task =() -> {egg.newEgg (eiName, x :: eiErstellt); }; neuer Thread (Aufgabe) .start(); '. –

+0

In Ihrem Code führt die Methode 'newEgg' zwei Dinge aus: ein Ei erstellen und festlegen, was danach passiert (hier übergeben Sie das Ei an einen Verbraucher). Aber was, wenn du das Ei vor dem Verzehr transformieren willst? Oder wenn Sie den Rückruf asynchron in einem anderen Thread ausführen möchten? Mit dem 'CompletableFuture'-Framework können Sie genau das tun: Erstellen (synchronisieren oder asynchron) einer Pipeline, um Daten zu erstellen, zu transformieren und zu konsumieren, ohne die Geschäftsmethoden zu stören. –

Verwandte Themen