純粋なスレッド管理の観点からは、私が考える最もクリーンな方法は、エグゼキュータを使用することです。それはあなたのクローニングの問題を解決するものではありません。
private final Runnable save = new Runnable() {
public void run() {
saveTheGame();
}
}
private final ExecutorService executor = Executors.newFixedThreadPool(1);
て保存:コールとエグゼキュータのサービスがあること埋め込み例えば、クラスのインスタンスメンバとして、
public void saveTheGame() {
//you maybe need to take a snapshot, which might require synchronization
GameState state = ....;
}
実行可能なを作成します。
ゲームを節約する方法を作成します。ゲームとして、必要なとき:
executor.submit(save);
をするときCシャットダウンするexecutorを忘れないでくださいあなたのアプリ失う:
executor.shutdown();
をあなたはまた、例えばx分ごとに実行される代わりにScheduledExecutorService
を使用することができます。
クラスは、例えば次のようになります。
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
スナップショットを作成せずに状態を安全に書き込む方法がわかりません。 –
@Martin Jamesそれはあなたの状態がどのように組織されているかによって異なります。たとえば、タイムスタンプの付いたイベントを保存する場合は、そうする必要はありません。 (チェスのゲームを考えてください) – biziclop