Java回调函数或静态类

时间:2016-05-30 21:59:42

标签: java lambda callback

我创造了一个游戏而且我遇到了这个问题:

我有类游戏,在游戏中,我有厨房。 当玩家输入例如:/ new egg I do:game.kitchen.newEgg()

我想知道最好的方法是什么,以及如何通知游戏Egg已经完成。

我尝试将类游戏设为静态,但看起来并不正确。

我也尝试过每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.");
}

所有树方法都有效,但这是正确的方法吗? 我应该怎么做? 什么是游戏的最佳解决方案?

1 个答案:

答案 0 :(得分: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();
        }
    }

}