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