从纯粹的线程管理角度来看,我认为最简洁的方式就是使用执行程序。这并不能解决你的克隆(或不)问题。
创建一个保存游戏的方法:
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);
不要忘记关闭执行器时,c失去你的应用程序:
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();
你将要解决的同步,无论您选择的解决方案。 – biziclop 2012-04-17 23:01:35
我看不到如何在不拍摄快照的情况下安全地写入状态。 – 2012-04-17 23:02:04
@马丁詹姆斯这取决于你的国家是如何组织的。例如,如果您存储时间戳事件,则不必这样做。 (想象一下国际象棋游戏。) – biziclop 2012-04-17 23:05:14