說我有一個類:後臺線程複製集合並重新初始化原始,可能嗎?
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秒創建一個隊列副本,重新設置原始消息隊列,以便在舊副本持久保存到文件/ db時開始獲取新數據。
通過這種方式,任何未來的寫入都將完成到一個新的隊列。
在我的測試中,這不起作用,因爲我似乎無法重新初始化傳入線程的隊列。
我認爲這是因爲消息隊列通過引用傳入,但它傳遞引用的副本,並且不允許更改引用。您可以更改被引用的對象,但不能更改引用。
如果這是真的,那麼我有什麼選擇呢?我可以在類聊天中公開一些方法來爲我做這個嗎?
注意:當我的應用程序運行時,聊天對象只創建一次。
Chat對象將被多個線程訪問。
更新
只會有這將不會做這種「持久性」單線程的,我希望它在Chat.messages隊列工作。我希望它做的僅僅是使收集的副本,並重新設置聊天的集合,然後就可以對自己的時間來堅持隊列的複製版本到磁盤。
@Blackman有一個特別的原因,爲什麼'drainTo'不適合你? – 2012-04-04 15:21:21