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方法,将队列中的元素全部取出并放入集合中。最终,我们输出了集合中的元素,可以看到它们与队列中的元素相同。