2016-05-30 2 views
0

私はゲームを作成していると私は、この問題でこだわっている:Javaのコールバック関数または静的クラス

私はクラスのゲームを持っているし、ゲーム内で、私はキッチンがあります。 プレイヤーが次のように入力した場合:/ new egg私は:game.kitchen.newEgg()

どのような最善の方法であり、どのように私は卵が完了したことをゲームに通知することができます知っていると思います。

Gameクラスを静的に入れてみましたが、正しくないようです。

は、私はまた、1秒ごとのゲームコールkitchen.isReady()(どちらもこれが正しいように見えるん)

を試してみましたが、私の最後の試みは、このような消費者の作成した:

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); 
    } 
} 

と中をゲーム:

public void createEgg(String eggName){ 
    System.out.println("Creating an Egg"); 
    Kitchen egg = new Kitchen(); 
    Gamex x = new Gamex(); 
    Runnable task2 =() -> { egg.newEgg(eggName, x::eggCreated); }; 
    new Thread(task2).start(); 
    System.out.println("game continue..."); 
} 

public void eggCreated(String eggName) { 
    System.out.println("Egg: " + eggName + " finished."); 
} 

すべてのツリーメソッドは機能しましたが、これは正しい方法ですか? どうすればいいですか? ゲームに最適なソリューションは何ですか?

+0

あなたの意図が何であるかはまだ不明です。並行プログラミングを扱っていることに言及し、それぞれのアクティブなエンティティを記述します。 –

+0

あなたはどこでも 'newEgg()'を呼び出すことはありません。 'egg.applyFunction()'はどこにありますか?そして、あなたは何をつかまえていますか? – shmosel

+0

メソッド名を修正しました。ごめんなさい。 @ E_net4:私はキッチンを含むエンジン(ゲーム)を持っています。キッチンは卵を作る責任がある。それが終わると、何らかの理由でゲームに通知したいと思っています(ユーザーポイントを更新し、お金を減らしています...など...)。私の質問です。それにはどのような方法がありますか?私の提案の一つ?他のものは完全に異なっていますか?ありがとう。 –

答えて

0

非同期ジョブが完了したことが通知されると、CompletableFuture<V>(Java 8)のジョブになります。 Future<V>とよく似ていますが、ジョブが完了するとすぐにトリガーされる追加のコールバックをアタッチすることができます。ここで

はあなたのゲームエンジンに適応することができ、最小限の作業例です:

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

こんにちは、あなたの答えをありがとう、私はそれが好きだった。しかしなぜそれが私の解決策よりも 'Runnable task =() - > {egg.newEgg(eggName、x :: eggCreated); }; 新しいスレッド(タスク).start(); ' –

+0

コードでは、 'newEgg'メソッドは2つのことを行います:卵を作成し、後で何が起きるかを調整します(ここでは卵を消費者に渡します)。 しかし、卵を消費する前に卵を変えたいと思ったらどうしますか?または、別のスレッドでコールバックを非同期に実行したい場合は、 'CompletableFuture'フレームワークでは、パイプラインを作成(変換または同期化)してビジネスメソッドを妨害することなく、データを作成、変換、および消費することができます。 –

関連する問題