從純粹的線程管理角度來看,我認爲最簡潔的方式就是使用執行程序。這並不能解決你的克隆(或不)問題。
創建一個保存遊戲的方法:
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