我创造了一个游戏而且我遇到了这个问题:
我有类游戏,在游戏中,我有厨房。 当玩家输入例如:/ 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.");
}
所有树方法都有效,但这是正确的方法吗? 我应该怎么做? 什么是游戏的最佳解决方案?
答案 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();
}
}
}