说我有一个类:后台线程复制集合并重新初始化原始,可能吗?
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