クラスがあるとします:
public class Chat {
  private volatile ConcurrentLinkedQueue messages = new ConcurrentLinkedQueue();
  // getter/setter for messages queue
}
そして、このクラスのインスタンスをパラメーターとして受け取るバックグラウンド スレッドがあります。
Thread t = new Thread(new QueuePersister(messages));
t.start();
スレッドのタスクは次のとおりです。
public class QueuePersister implements Runnable {
   private volatile ConcurrentLinkedQueue messages = new ConcurrentLinkedQueue(); 
   public QueuePersister(ConcurrentLinkedQueue messages) {
     this.messages = messages;
   }
   @Override
    public void run() {
        while(true) {
            // this is a 2 step process, probably should synchronize?? i.e. copy and re-initializing
            ConcurrentLinkedQueue copy = messages;
            messages = new ConcurrentLinkedQueue();
            // save to disk using the copy queue
            // sleep for x seconds
         }
    }
}
私がやろうとしているアイデアは次のとおりです。
私のメッセージはキューに保存され、x 秒ごとにバックグラウンド スレッドがキューのコピーを作成し、元のメッセージ キューを再設定して、古いコピーがファイル/データベースに保持されている間、新しいデータの取得を開始できるようにします。
このようにして、将来の書き込みはすべて新しいキューに対して行われます。
私のテストでは、スレッドに渡されたキューを再初期化できないように見えるため、これは機能しません。
これは、メッセージキューが参照によって渡されるためだと思いますが、参照のコピーを渡しているため、参照を変更することはできません。参照されているオブジェクトを変更することはできますが、参照を変更することはできません。
これが本当なら、これを行うにはどのようなオプションが必要ですか? クラス Chat で、これを行ういくつかのメソッドを公開できますか?
注: アプリケーションの実行中、Chat オブジェクトは 1 回だけ作成されます。
Chat オブジェクトは複数のスレッドからアクセスされます。
アップデート
この「永続化」を実行するスレッドは 1 つだけで、Chat.messages キューで動作するようにしたいと考えています。私がやりたいことは、単にコレクションのコピーを作成し、チャットのコレクションを再設定してから、コピーされたバージョンのキューをディスクに永続化するのに時間がかかることです。