2012-04-17 12 views
0

オブジェクト(私のゲームのモデル/データ)をディスクに保存したいのですが、ゲームがかなり大規模になり、ゲームを比較的スムーズに動かすために、別のスレッドで保存を実行するのが理にかなっていると考えています。オブジェクトをファイルに保存するための新しいスレッドを作成する

これを達成する最適な方法は何ですか?たいていの場合Runnableを意図していないので、GameState(モデル)をRunnableまたはThreadの拡張にすることが理にかなっているかどうかはわかりませんでした - 論理的にはRunnableであってはなりませんか?

その他の可能性私が調べたその他の可能性は、GameStateまたはGameStateのコピーを渡すRunnable GameSaverクラスを持つことです。しかし、GameStateに合格した場合、またはクラスがクローンされている間にゲームが遅くなる場合、これが同期に問題を引き起こす可能性があります。

何が最善のアプローチか、プロとコンセプトのアプローチですか?他の選択肢も高く評価されました。私の検索は網羅的です。

+0

あなたが選ぶものは何でも解決、同期を解決する必要があります。 – biziclop

+0

スナップショットを作成せずに状態を安全に書き込む方法がわかりません。 –

+0

@Martin Jamesそれはあなたの状態がどのように組織されているかによって異なります。たとえば、タイムスタンプの付いたイベントを保存する場合は、そうする必要はありません。 (チェスのゲームを考えてください) – biziclop

答えて

2

純粋なスレッド管理の観点からは、私が考える最もクリーンな方法は、エグゼキュータを使用することです。それはあなたのクローニングの問題を解決するものではありません。

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(); 
+0

クラス内でRunnableを作成することを完全に忘れてしまいました。私はExecutorServiceを調べる必要がありますが、これはかなりきちんとしたテクニックのようです。このような整頓以外のメリットは何ですか? –

+1

スレッド管理の低レベルの詳細を扱う必要はありませんが、必要であれば同期を処理する必要があります。この例を簡単に変更して、 'ScheduledExecutorService'を使ってx分ごとに自動的に保存することができます。 – assylias

+0

優秀、ありがとう。これは非常にきれいな解決策に見えます - 今私はスナップショットを取る必要があるかどうかを決定する必要があります。 –

関連する問題