我想将一个对象(我的游戏的模型/数据)保存到磁盘,但是因为游戏可以变得非常大 - 可行的大到足以让几个游戏记录存储 - 我认为执行保存是有意义的在一个单独的线程中,以保持游戏运行相对顺利。
实现这一目标的最佳方法是什么?我不确定将GameState(模型)设置为可运行的还是Thread的扩展是否有意义,因为大多数时候它不是Runnable - 从逻辑上讲,它不应该是Runnable?
我看过的其他可能性是有一个Runnable GameSaver类,我传递了GameState或GameState的副本。然而,据推测,如果我通过GameState或者在克隆类时将减慢游戏速度,这将导致同步问题。
什么是最好的方法,或者方法的专业和方法?任何其他选择也是赞赏的 - 我怀疑我的搜索是详尽无遗的。
答案 0 :(得分:2)
从纯线程管理的角度来看,我认为最干净的方法是使用执行程序。这无法解决您的克隆(或不)问题。
创建一个保存游戏的方法:
public void saveTheGame() {
//you maybe need to take a snapshot, which might require synchronization
GameState state = ....;
}
创建一个runnable,例如,作为类实例成员,嵌入该调用和执行服务:
private final Runnable save = new Runnable() {
public void run() {
saveTheGame();
}
}
private final ExecutorService executor = Executors.newFixedThreadPool(1);
并在需要时保存游戏:
executor.submit(save);
关闭应用时,不要忘记关闭执行程序:
executor.shutdown();
您也可以使用ScheduledExecutorService
代替每隔x分钟运行一次。
该类可能如下所示:
public static class GameSaver {
private final Runnable save = new Runnable() {
@Override
public void run() {
saveGame();
}
};
private static final ExecutorService executor = Executors.newFixedThreadPool(1);
private final GameState state;
public GameSaver(GameState state) {
this.state = state;
}
public void save() {
executor.submit(save);
}
public static void close() {
executor.shutdown();
}
private void saveGame() {
//save your game here
}
}
并在您的主要代码中:
GameState state = getGameState();
GameSaver saver = new GameSaver(state);
saver.save();