純粋なスレッド管理の観点から、私が考える最もクリーンな方法は、エグゼキュータを使用することです。それはあなたのクローン作成(またはそうでない)問題を解決しません。
ゲームを保存するメソッドを作成します。
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();