0

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

    while (!contactList.isEmpty()) {

        Contact contact = null;

        synchronized (contactList) {

            if (!contactList.isEmpty()) {

                contact = contactList.get(0);
                contactList.remove(0);
            }
        }
        //call the service with contact
    }

有没有更有效的方法来完成这项工作?

目前,将所有联系人拆分为多个单独的程序会更快。

4

1 回答 1

3

如果您真的只想从列表的前面提取元素并且您想确保它们在那里,那么您应该查看 aConcurrentLinkedQueue代替。这也保证了 O(1) 的插入和删除,因为插入发生在队列的末尾,而检索发生在队列的头部,而无需向下移动元素。

因为您在进入此块之前声明数据存在,所以只有当列表本身为空poll时才会返回调用。null从那里,您必须决定null从队列中返回意味着什么。

一个(非常粗略的)示例:

ConcurrentLinkedQueue<Contact> contactQueue = new ConcurrentLinkedQueue<>();
Contact contact = contactQueue.poll(); // will return null if empty
于 2015-04-27T17:42:22.407 回答