【发布时间】:2014-12-07 06:28:58
【问题描述】:
我有一个用例,其中一个队列保存 UploadItem(s)。队列必须是线程安全的。 UploadItem 有一个方法 canUpload()。 UploadItems 被添加到队列的尾部,但 peek() 和 poll() 必须返回 canUpload() 为 true 的第一个 UploadItem。这可能是头部的项目或更新的项目。本质上,我希望项目在准备好上传之前被忽略,并且我希望队列返回准备好的最旧项目。
为了解决这个问题,我扩展了 ConcurrentLinkedQueue 并覆盖了 peek() 和 poll()。我已经同步了被覆盖的方法,并且正在使用迭代器来检索第一个有效项目。
public class UploadQueue extends ConcurrentLinkedQueue<UploadItem> {
public UploadQueue() {}
@Override public synchronized UploadItem peek() {
for (UploadItem item : this) {
if (item.canUpload()) {
return item;
}
}
return null;
}
@Override public synchronized UploadItem poll() {
for (UploadItem item : this) {
if (item.canUpload()) {
remove(item);
return item;
}
}
return null;
}
}
这是一个好的实现还是可以更有效地完成?使用迭代器检索项目是否有任何不利影响?我无法使用索引和 get() 选择项目,所以看来我必须使用迭代器。我也无法跟踪内部变量中的项目,因为它们是由外部函数链接和更改的。
这将在Android上运行并且Android仍然使用Java 6。面对Lock-Free Concurrent Linked List in Java和ConcurrentLinkedQueue$Node remains in heap after remove(),是否存在某些Android手机可能仍然存在Java内存泄漏的风险?有人知道 Java 是否通常在 Android 上更新/修补(在其主要版本内)?
【问题讨论】:
标签: java android multithreading concurrency queue