创建新线程以将对象保存到文件

时间:2012-04-17 22:57:39

标签: java multithreading performance

我想将一个对象(我的游戏的模型/数据)保存到磁盘,但是因为游戏可以变得非常大 - 可行的大到足以让几个游戏记录存储 - 我认为执行保存是有意义的在一个单独的线程中,以保持游戏运行相对顺利。

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

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

什么是最好的方法,或者方法的专业和方法?任何其他选择也是赞赏的 - 我怀疑我的搜索是详尽无遗的。

1 个答案:

答案 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();