我在许多线程之间共享一个列表。
线程需要的所有数据都在它们开始之前就存在了,我不会在列表中添加任何其他值。
每个踏步在列表中获取一个值,该值从列表中删除,并且完成了远距离调用。
该块已同步。

    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

10-06 06:19