Java LinkedTransferQueue drainTo()方法

Java LinkedTransferQueue drainTo()方法

drainTo(Collection c)

java.util.concurrent.LinkedTransferQueue类的 drainTo(Collection c) 方法是Java中的一个内置函数,它可以移除这个队列中的所有元素,并将它们添加到提供的集合中。这是一个比反复轮询这个队列更有效的方法。

当试图从队列中添加元素到集合c时,也有可能遇到失败,由于失败,当相关的异常被抛出时,元素被分配到两个集合中。如果一个队列试图向队列本身drainTo(),那么将抛出 IllegalArgumentException 。如果在操作过程中,指定的集合被修改,那么这个操作的行为就无法定义。所以在使用这类方法时,需要注意这类情况以克服异常。

语法

public int drainTo(Collection c)

参数: 该函数接受一个强制性参数c,它是要被转移到的元素的集合。

返回值: 该函数返回从队列中排入集合的元素的数量。

异常: 该方法抛出以下异常。

  • NullPointerException – 如果集合是空的
  • IllegalArgumentException – 如果该方法的参数阻止它被添加到指定的集合中。

下面的程序说明了java.util.concurrent.LinkedTransferQueue.drainTo()方法的使用。

程序 1: 程序将队列中的所有元素排到指定的集合中。

// Java Program Demonstrate drainTo()
// method of LinkedTransferQueue
  
import java.util.*;
import java.util.concurrent.LinkedTransferQueue;
  
class GFG {
    public static void main(String[] args)
    {
  
        // Initializing the List
        List<Integer> list = new ArrayList<Integer>();
  
        // Initializing the queue
        LinkedTransferQueue<Integer>
            queue = new LinkedTransferQueue<Integer>();
  
        // Adding elements to this queue
        for (int i = 10; i <= 15; i++)
            queue.add(i);
  
        // Printing the elements of the queue
        System.out.println("Elements in the queue = "
                           + queue);
  
        // drainTo() method removes all available elements
        // from this queue and adds them to the list
        queue.drainTo(list);
  
        // Printing the elements of the queue after drainTo()
        System.out.println("Elements left in the queue :"
                           + queue);
  
        // Printing the elements of the list
        System.out.println("Elements drained in the list :"
                           + list);
    }
}

输出:

Elements in the queue = [10, 11, 12, 13, 14, 15]
Elements left in the queue :[]
Elements drained in the list :[10, 11, 12, 13, 14, 15]

程序2: 显示drainTo()中NullPointerException的程序。

// Java Program Demonstrate drainTo()
// method of LinkedTransferQueue
  
import java.util.ArrayList;
import java.util.concurrent.LinkedTransferQueue;
  
class GFG {
    public static void main(String[] args)
        throws InterruptedException
    {
  
        // Initializing the queue
        LinkedTransferQueue<Integer>
            queue = new LinkedTransferQueue<Integer>();
  
        // add elements to queue
        queue.put(10);
        queue.put(20);
        queue.put(30);
  
        // create a collection with null
        ArrayList<Integer> add = null;
  
        // try to drain null queue to collection
        try {
            // this will throw exception
            // as the add list is null
            queue.drainTo(add);
        }
        catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}

输出:

Exception: java.lang.NullPointerException

drainTo(Collection c, int maxElements)

java.util.concurrent.LinkedTransferQueue的 drainTo(Collection c, int maxElements) 方法是Java中的一个内置函数,用于将固定数量的元素(在drainTo()中以整数形式传递给集合,也作为参数传递给方法。在转移元素之后,LinkedTransferQueue只有那些没有转移到集合中的元素。这个函数与上面的函数相同,只是在传输固定数量的元素时有一些限制。

语法

public int drainTo(Collection c,
          int maxElements)

参数:该方法接受两个参数。

  • c – 它表示要从LinkedTransferQueue转移元素的集合。
  • maxElements – 这是一个整数类型,指的是要转移到集合中的最大元素数。

返回值:该函数返回从队列中排入集合的元素数量。

异常:该方法会抛出以下异常。

**NullPointerException** - 如果集合是空的。
**IllegalArgumentException** - 如果该方法的参数阻止它被添加到指定的集合中。

示例1:程序从队列中最多抽取给定数量的可用元素到指定的集合中。

    // Java Program Demonstrate drainTo()
    // method of LinkedTransferQueue
      
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.LinkedTransferQueue;
      
    class GFG {
        public static void main(String[] args)
        {
      
            // Initializing the List
            List<Integer> list = new ArrayList<Integer>();
      
            // Initializing the queue
            LinkedTransferQueue<Integer>
                queue = new LinkedTransferQueue<Integer>();
      
            // Adding elements to this queue
            for (int i = 1; i <= 10; i++)
                queue.add(i);
      
            // Printing the elements of the queue
            System.out.println("Elements in the queue = "
                               + queue);
      
            // drainTo() method removes at most
            // the given number of available elements
            // from this queue and adds them to the list.
            queue.drainTo(list, 5);
      
            // Printing the elements of the queue after drainTo()
            System.out.println("Elements left in the queue :"
                               + queue);
      
            // Printing the elements of the list
            System.out.println("Elements drained in the list :"
                               + list);
        }
    }

输出:

Elements in the queue = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Elements left in the queue :[6, 7, 8, 9, 10]
Elements drained in the list :[1, 2, 3, 4, 5]

程序2: 显示drainTo()中NullPointerException的程序。

// Java Program Demonstrate drainTo()
// method of LinkedTransferQueue
  
import java.util.ArrayList;
import java.util.concurrent.LinkedTransferQueue;
  
class GFG {
    public static void main(String[] args)
        throws InterruptedException
    {
  
        // Initializing the queue
        LinkedTransferQueue<Integer>
            queue = new LinkedTransferQueue<Integer>();
  
        // add elements to queue
        queue.put(10);
        queue.put(20);
        queue.put(30);
  
        // create a collection with null
        ArrayList<Integer> add = null;
  
        // try to drain null queue to collection
        try {
            // this will throw exception
            // as the add list is null
            queue.drainTo(add, 2);
        }
        catch (Exception e) {
            System.out.println("Exception: " + e);
        }
    }
}

输出:

Exception: java.lang.NullPointerException

参考资料

  • https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html#drainTo(java.util.Collection)
  • https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedTransferQueue.html#drainTo(java.util.Collection, %20int)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程