0

我想将一个对象(我的游戏的模型/数据)保存到磁盘,但由于游戏可能会变得非常大 - 可能大到足以存储几个游戏滴答 - 我认为单独执行保存是有意义的线程以保持游戏运行相对流畅。

实现这一目标的最佳方法是什么?我不确定让 GameState(模型)成为可运行的还是 Thread 的扩展是否有意义,因为大多数时候它并不打算成为可运行的——那么从逻辑上讲,它不应该是可运行的?

我看过的其他可能性是有一个 Runnable GameSaver 类,我将 GameState 或 GameState 的副本传递给它。但是,如果我通过 GameState,这可能会导致同步问题,或者在克隆类时会减慢游戏速度。

最好的方法是什么,或者方法的优点和缺点是什么?任何其他选择也很受欢迎 - 我怀疑我的搜索已经详尽无遗。

4

1 回答 1

2

从纯线程管理的角度来看,我认为最干净的方法是使用执行器。这并不能解决您的克隆(或不克隆)问题。

创建一个保存游戏的方法:

public void saveTheGame() {
    //you maybe need to take a snapshot, which might require synchronization
    GameState state = ....;
}

创建一个可运行的,例如作为类实例成员,嵌入该调用和执行程序服务:

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();
于 2012-04-17T23:08:12.123 回答