我在很多线程之间共享一个列表。 线程所需的所有数据在它们开始之前都存在,我不会在列表中添加任何其他值。 每个踏板取一个列表中的值,从列表中删除值,并进行远程调用。 该块已同步。
while (!contactList.isEmpty()) {
Contact contact = null;
synchronized (contactList) {
if (!contactList.isEmpty()) {
contact = contactList.get(0);
contactList.remove(0);
}
}
//call the service with contact
}
有更有效的方法来完成这项工作吗?
目前,接受所有联系并将其拆分为多个单独的程序会更快。
答案 0 :(得分:3)
如果您真的只想从列表前面提取元素并且想要确保它们在那里,那么您应该查看ConcurrentLinkedQueue
。这也保证了O(1)的插入和删除,因为插入发生在队列的末尾,并且检索发生在它的头部而不需要向下移动元素。
由于您在输入此块之前声明数据存在,因此如果列表本身为空,则对poll
的调用将仅返回null
。从那里开始,您必须决定从队列中返回null
的含义。
一个(非常粗略)的例子:
ConcurrentLinkedQueue<Contact> contactQueue = new ConcurrentLinkedQueue<>();
Contact contact = contactQueue.poll(); // will return null if empty