LinkedBlockingQueue的drainTo方法

LinkedBlockingQueue是Java中的一个阻塞队列实现,它支持多线程并发操作。drainTo方法是LinkedBlockingQueue提供的一个方法,用于将队列中的元素转移到另一个集合中。

drainTo方法有两个重载方法,分别为:

1. drainTo(Collection<? super E> c)
将队列中的所有元素转移到指定的集合中。该方法会一直阻塞直到队列为空。

2. drainTo(Collection<? super E> c, int maxElements)
将队列中最多maxElements个元素转移到指定的集合中。如果队列中的元素不足maxElements个,则只转移队列中的所有元素。该方法会一直阻塞直到队列为空或者转移了maxElements个元素。

使用drainTo方法可以方便地将队列中的元素批量取出,适用于一次性处理多个元素的场景。同时,由于该方法会阻塞直到队列为空,因此可以避免在队列为空时进行轮询等浪费资源的操作。


案例1

drainTo方法的定义如下:

public int drainTo(Collection<? super E> c, int maxElements)

参数c表示要将元素放入的集合,maxElements表示最多取出的元素个数。方法的返回值为实际取出的元素个数。

示例代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueDemo {
    public static void main(String[] args) {
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
        for (int i = 1; i <= 10; i++) {
            queue.offer(i);
        }
        List<Integer> list = new ArrayList<>();
        int count = queue.drainTo(list, 5);
        System.out.println("取出了" + count + "个元素:" + list);
    }
}

运行结果为:

取出了5个元素:[1, 2, 3, 4, 5]

在上面的示例中,我们创建了一个LinkedBlockingQueue,并向其中添加了10个元素。然后,我们创建了一个ArrayList作为目标集合,调用drainTo方法将队列中的前5个元素取出并放入目标集合中。最后,我们打印了取出的元素个数和目标集合的内容。


drainTo(Collection<? super E> c)

案例2

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;

public class Example {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();

        // 添加元素到队列中
        queue.offer("A");
        queue.offer("B");
        queue.offer("C");

        // 创建一个集合用于接收队列中的元素
        List<String> list = new ArrayList<>();

        // 将队列中的元素全部取出并放入集合中
        queue.drainTo(list);

        // 输出集合中的元素
        System.out.println(list); // 输出:[A, B, C]
    }
}

在上面的示例代码中,我们首先创建了一个LinkedBlockingQueue对象,并向其中添加了三个元素。然后,我们创建了一个ArrayList对象用于接收队列中的元素。

最后,我们调用了LinkedBlockingQueue的drainTo方法,将队列中的元素全部取出并放入集合中。最终,我们输出了集合中的元素,可以看到它们与队列中的元素相同。

你可能感兴趣的:(java)