Java中的ArrayBlockingQueue drainTo()方法
ArrayBlockingQueue是一个有界的阻塞队列,内部存储的元素由数组支持。
- ArrayBlockingQueue类是Java集合框架的一个成员。
- 有界意味着它将有一个固定的大小,你不能存储的元素数量超过队列的容量。
- 该队列也遵循FIFO(先进先出)规则来存储和删除队列中的元素。
- 如果你试图把一个元素放进一个满的队列或从一个空的队列中取出一个元素,那么队列将阻止你。
drainTo(Collection c) 方法 从这个队列中删除所有可用的元素,并将它们添加到给定的集合中。也可以通过提供元素的数量’n’作为方法的第二个参数来固定需要被删除的元素的数量。
根据传递给它的参数,有两种类型的drainTo方法。
drainTo()方法
用于将所有元素转移到一个集合。与使用循环重复轮询这个队列相比,排水操作更有效率。当试图将元素添加到 集合c 中时,也有可能遇到失败,由于这种失败,当相关的异常被抛出时,元素可能既不存在于集合中,也不存在于两个集合中。如果你试图将一个队列排到自身,将抛出IllegalArgumentException。如果在操作过程中,指定的集合被修改,那么这个操作的行为就无法定义。所以在使用这类方法时,我们需要注意这类情况,这样我们才能克服异常。
语法
public int drainTo(Collection c)
参数: 该方法接受一个参数c,指的是要转移元素的集合。
返回值: 该方法返回所转移的元素的数量。
异常: 该方法可能会抛出三种类型的异常。
- UnsupportedOperationException – 如果指定的集合不支持元素的添加。
- ClassCastException – 如果这个队列的一个元素的类别使它不能被添加到指定的集合中。
- NullPointerException – 如果指定的集合是空的
- IllegalArgumentException – 如果指定的集合是这个队列,或者这个队列的某个元素的某些属性使它不能被添加到指定的集合中。
下面的程序说明了ArrayBlockingQueue的drainTo(Collection c)方法。
// Program to demonstrate drainTo(Collection c)
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
public static void main(String[] args)
{
// Define capacity of ArrayBlockingQueue
int capacity = 10;
// Create object of ArrayBlockingQueue
ArrayBlockingQueue queue = new
ArrayBlockingQueue(capacity);
// Add elements to ArrayBlockingQueue
queue.add(23);
queue.add(32);
queue.add(45);
queue.add(12);
queue.add(27);
queue.add(67);
// Print queue before drainTo operation
System.out.println("Before drainTo Operation");
System.out.println("queue = " + queue);
// Create Collection object to
// transfer elements
ArrayList list = new
ArrayList();
// Call drainTo method of queue
// and pass collection as parameter.
queue.drainTo(list);
// Print queue before drainTo operation
System.out.println("After drainTo Operation");
System.out.println("queue = " + queue);
System.out.println("collection = " + list);
}
}
输出
Before drainTo Operation
queue = [23, 32, 45, 12, 27, 67]
After drainTo Operation
queue = []
collection = [23, 32, 45, 12, 27, 67]
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)
// method of ArrayBlockingQueue
import java.util.ArrayList;
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
public static void main(String[] args)
{
// Define capacity of ArrayBlockingQueue
int capacity = 10;
// Create object of ArrayBlockingQueue
ArrayBlockingQueue queue = new
ArrayBlockingQueue(capacity);
// Add elements to ArrayBlockingQueue
queue.add("aman");
queue.add("sudhir");
queue.add("harsh");
queue.add("rahul");
queue.add("raunak");
// Print queue before drainTo operation
System.out.println("Before drainTo Operation");
System.out.println("queue = " + queue);
// Transfer elements from ArrayBlockingQueue;
ArrayList list = new ArrayList();
// Define no of elements to be transferred
int maxElements = 3;
// Call drainTo method of queue and pass
// the collection as parameter.
queue.drainTo(list, maxElements);
// Print queue before drainTo operation
System.out.println("After drainTo Operation");
System.out.println("queue = " + queue);
System.out.println("collection = " + list);
}
}
输出
Before drainTo Operation
queue = [aman, sudhir, harsh, rahul, raunak]
After drainTo Operation
queue = [rahul, raunak]
collection = [aman, sudhir, harsh]
参考资料: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html#drainTo(java.util.Collection)
极客教程