Java中的ArrayBlockingQueue drainTo()方法
ArrayBlockingQueue 是一个有界的,阻塞队列,它使用数组内部存储元素。
- ArrayBlockingQueue 类是Java集合框架的成员。
- 有界意味着它将具有固定的大小,你不能存储超出队列容量的元素。
- 队列还遵循先进先出的规则来存储和删除队列中的元素。
- 如果你试图将一个元素放入一个已满的队列中或从一个空队列中取出一个元素,那么队列将阻塞你。
drainTo( Collection c ) 方法 从此队列中删除所有可用元素并将它们添加到给定的集合中 。可以通过为方法提供第二个参数作为所需耗尽的元素的数量来固定元素数量。
根据传递给它的参数,drainTo方法有两种类型:
1. drainTo()方法用于将所有元素传输到一个集合中。耗尽操作比使用循环重复轮询此队列更有效。尝试将元素添加到 collection c 时,还有可能会遇到失败,并且当抛出相关异常时,元素可能存在于任何一个或两个集合中。如果你试图将队列排空到它自己,IllegalArgumentException将抛出。如果在操作正在进行时修改指定的集合,则此操作的行为是未定义的。因此,对于使用这样的方法,我们需要注意这种情况,以便克服异常。
语法:
public int drainTo( _Collection c_ )
参数: 该方法接受一个参数 c ,它指的是要传输元素的集合。
返回值: 该方法返回耗尽掉的元素数量。
异常: 该方法可能会抛出三种类型的异常:
- UnsupportedOperationException - 如果指定的集合不支持添加元素。
- ClassCastException - 如果此队列的元素的类阻止将其添加到指定的集合中。
- NullPointerException - 如果指定的集合为null。
- IllegalArgumentException - 如果指定的集合是此队列,或者此队列的某个元素的某个属性阻止将其添加到指定的集合中。
下面的程序说明了ArrayBlockingQueue的drainTo( Collection c )方法。
// 该程序演示了 drainTo(Collection c) 方法
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
public static void main(String[] args)
{
// 定义 ArrayBlockingQueue 容量
int capacity = 10;
// 创建 ArrayBlockingQueue 对象
ArrayBlockingQueue queue = new
ArrayBlockingQueue(capacity);
// 向 ArrayBlockingQueue 中添加元素
queue.add(23);
queue.add(32);
queue.add(45);
queue.add(12);
queue.add(27);
queue.add(67);
// 执行 drainTo 操作前打印队列
System.out.println("执行 drainTo 操作前");
System.out.println("队列 = " + queue);
// 创建集合对象以传输元素
ArrayList list = new
ArrayList();
// 调用队列的 drainTo 方法,并将集合作为参数传入。
queue.drainTo(list);
// 执行 drainTo 操作后打印队列
System.out.println("执行 drainTo 操作后");
System.out.println("队列 = " + queue);
System.out.println("集合 = " + list);
}
}
输出:
执行 drainTo 操作前
队列 = [23, 32, 45, 12, 27, 67]
执行 drainTo 操作后
队列 = []
集合 = [23, 32, 45, 12, 27, 67]
2. drainTo(Collection c, int maxElements) 方法用于将固定数量的元素传输到集合中。传输后,ArrayBlocking队列仅包含未传输到集合中的那些元素。 该函数与上述函数相同,但具有一定的限制。
语法:
public int drainTo( _Collection c, int maxElements_ )
参数:
该方法接受两个参数:
- c – 这是要传输元素的集合。
- maxElements – 这是整数类型,指的是要传输到集合中的最大元素数量。
返回值:
被传输的元素数量。
异常:
- UnsupportedOperationException – 如果指定集合不支持添加元素
- ClassCastException – 如果该队列的元素类别防止将其添加到指定集合中
- NullPointerException – 如果指定集合为空
- IllegalArgumentException – 如果指定集合是此队列,或者该队列的某个元素的某些属性防止将其添加到指定集合中
下面的程序演示了ArrayBlockingQueue的 drainTo(Collection c, int maxElements) 方法的工作原理。
//Program Demonstrate drainTo(Collection c, int maxElements)
//方法的ArrayBlockingQueue
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
public static void main(String[] args)
{
//定义ArrayBlockingQueue的容量
int capacity = 10;
//创建ArrayBlockingQueue
ArrayBlockingQueue queue = new
ArrayBlockingQueue(capacity);
//向ArrayBlockingQueue添加元素
queue.add("aman");
queue.add("sudhir");
queue.add("harsh");
queue.add("rahul");
queue.add("raunak");
//在drainTo操作之前打印队列
System.out.println("drainTo操作之前");
System.out.println("queue = " + queue);
//从ArrayBlockingQueue转移元素
ArrayList list = new ArrayList();
//定义要转移的元素数
int maxElements = 3;
//调用队列的drainTo方法,并将集合作为参数传递。
queue.drainTo(list, maxElements);
//在drainTo操作之后打印队列
System.out.println("drainTo操作之后");
System.out.println("queue = " + queue);
System.out.println("collection = " + list);
}
}
输出:
drainTo操作之前
queue = [aman, sudhir, harsh, rahul, raunak]
drainTo操作之后
queue = [rahul, raunak]
collection = [aman, sudhir, harsh]
参考文献: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html#drainTo(java.util.Collection)
极客教程