📜  Java中的ArrayBlockingQueue drainTo() 方法

📅  最后修改于: 2022-05-13 01:55:45.850000             🧑  作者: Mango

Java中的ArrayBlockingQueue drainTo() 方法

ArrayBlockingQueue是有界的阻塞队列,它在内部存储由数组支持的元素。

  • ArrayBlockingQueue类是Java集合框架的成员。
  • 有界意味着它将具有固定大小,您不能存储数量超过队列容量的元素。
  • 队列还遵循 FIFO(先进先出)规则来存储和删除队列中的元素。
  • 如果你试图将一个元素放入一个满队列或从一个空队列中取出一个元素,那么队列会阻止你。

drainTo( Collection c )方法从这个队列中移除所有可用的元素并将它们添加到给定的集合中。通过提供元素的数量'n'作为方法的第二个参数,也可以固定需要排出的元素数量。

根据传递给它的参数,有两种类型的 drainTo 方法:

1. drainTo() 方法用于将所有元素转移到一个集合中。排空操作比使用循环重复轮询此队列更有效。尝试将元素添加到集合 c时也有可能遇到失败,因此当相关异常被抛出时,失败元素可能不会出现在任何一个、任何一个或两个集合中。如果您尝试将队列排空到自身,则会抛出 IllegalArgumentException。如果在操作进行时修改了指定的集合,则此操作的行为是 undefined 。因此,对于使用此类方法,我们需要处理这种情况,以便我们能够克服异常。

句法

public int drainTo(Collection c)

参数:该方法接受一个参数c ,该参数引用集合来传递元素

返回值:该方法返回排出的元素数。

异常:该方法可能会抛出三种类型的异常:

  • UnsupportedOperationException – 如果指定的集合不支持添加元素
  • ClassCastException – 如果此队列的元素的类阻止它被添加到指定的集合
  • NullPointerException – 如果指定的集合为空
  • IllegalArgumentException – 如果指定的集合是这个队列,或者这个队列的元素的某些属性阻止它被添加到指定的集合中

下面的程序说明了 ArrayBlockingQueue 的 drainTo( Collection c ) 方法。

Java
// 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);
    }
}


Java
// 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 = [23, 32, 45, 12, 27, 67]
After drainTo Operation
queue = []
collection = [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) 方法的工作。

Java

// 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: Java Java.util.Collection)