クラスがあるとします:
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 キューで動作するようにしたいと考えています。私がやりたいことは、単にコレクションのコピーを作成し、チャットのコレクションを再設定してから、コピーされたバージョンのキューをディスクに永続化するのに時間がかかることです。