Java中的ArrayBlockingQueue offer()方法

Java中的ArrayBlockingQueue offer()方法

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

  • ArrayBlockingQueue 类是Java集合框架的成员。
  • 有界意味着它的大小固定,您不能在队列的容量之外存储更多的元素。
  • 队列还遵循FIFO(先进先出)规则,用于存储和删除队列中的元素。
  • 如果您尝试在满队列中放置一个元素或从空队列中取出一个元素,则队列将阻塞您。

offer()方法有两种类型,取决于传递给它的参数:

  1. offer(E元素) 方法在队列(ArrayBlockingQueue)尾部插入参数传递的元素,如果队列未满。它返回true表示添加操作成功,如果队列已满,返回false。该方法优于add()方法,因为add方法在队列已满时会抛出错误,但offer()方法则会返回false。

语法:
public boolean offer(E e)

参数: 该方法接受一个参数element。这是要添加到队列中的元素。

返回值: 当添加操作成功时,此方法返回True,如果队列已满则返回false。

异常: 如果指定的元素为空,则该方法将引发NullPointerException异常。

下面的程序演示了ArrayBlockingQueue的offer(E元素)方法:

程序1:

//演示ArrayBlockingQueue的offer(E元素)方法
  import java.util.concurrent.ArrayBlockingQueue;

  public class GFG {
      public static void main(String[] args) {
          //定义一个ArrayBlockingQueue的容量
          int capacity = 5;

          //创建ArrayBlockingQueue的对象
          ArrayBlockingQueue<Integer> queue = 
              new ArrayBlockingQueue<Integer>(capacity);

          //向ArrayBlockingQueue中添加5个元素
          System.out.println("添加423:"+queue.offer(423));
          System.out.println("添加243:"+queue.offer(243));
          System.out.println("添加237:"+queue.offer(237));
          System.out.println("添加867:"+queue.offer(867));
          System.out.println("添加23:"+queue.offer(23));

          //检查队列是否已满
          if(queue.remainingCapacity()==0) {
              System.out.println("队列已满");
              System.out.println("队列中包含 "+queue);
          }else {
              System.out.println("队列未满");
              System.out.println("队列中包含 "+queue);
          }

          //尝试添加更多的元素
          System.out.println("添加123:"+queue.offer(123));
          System.out.println("添加321:"+queue.offer(321));
      }
  }

输出:

添加423:true
添加243:true
添加237:true
添加867:true
添加23:true
队列已满
队列中包含 [423, 243, 237, 867, 23]
添加123:false
添加321:false

程序2:

//演示ArrayBlockingQueue的offer(E元素)方法
 import java.util.concurrent.ArrayBlockingQueue;

 public class GFG {
     public static void main(String[] args) {
         //定义一个ArrayBlockingQueue的容量
         int capacity = 5;

         //创建ArrayBlockingQueue的对象
         ArrayBlockingQueue<Integer> queue = 
             new ArrayBlockingQueue<Integer>(capacity);

         //向ArrayBlockingQueue中添加元素
         System.out.println("添加423:"+queue.offer(423));
         System.out.println("添加243:"+queue.offer(243));
         System.out.println("添加237:"+queue.offer(237));
         System.out.println("添加867:"+queue.offer(867));

         //删除头部
         queue.poll();

         //再次尝试添加元素
         System.out.println("添加123:"+queue.offer(123));
         System.out.println("添加321:"+queue.offer(321));
     }
 }

输出:

添加拥有名称为Aman的用户: true
添加拥有名称为Amar的用户: true
添加拥有名称为Sanjeet的用户: true
添加拥有名称为Suvo的用户: true
添加拥有名称为Ravi的用户: true
队列已满
添加拥有名称为Ram的用户: false
添加拥有名称为Mohan的用户: false
  • offer(E element, long timeout, TimeUnit unit) 方法将传递给方法的元素作为参数插入此队列(ArrayBlockingQueue)的尾端,如果队列未满。如果队列已满,它将等待指定的时间以便空间变得可用。当添加操作成功时,返回true,如果队列已满并且在空间可用之前经过了指定的等待时间,返回false。当我们希望等待队列移除其元素并且队列未满时,此方法很有用,此时元素将被添加到队列中,但我们可以等待指定的时间,该时间可以由我们定义。

语法:

public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException

参数: 该方法有三个参数:

  • element (Object)- 要添加到队列中的元素。
  • timeout (long)- 等待放弃的时间,以unit为单位。
  • unit (TimeUnit)- 一个TimeUnit,确定如何解释timeout参数。
    • 示例: 在这个例子中,我们将创建一个大小为2的ArrayBlockingQueue对象。我们将向列表中添加两个元素,然后尝试使用offer(E element, long timeout, TimeUnit unit)方法向列表中再添加一个元素。我们将等待时间设置为3秒。输出将显示在3秒内是否将元素添加到列表中。

语法:

public boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException

参数: 该方法有三个参数:

  • element (Object)- 要添加到队列中的元素。
  • timeout (long)- 在放弃之前等待的时间长度,以unit为单位。
  • unit (TimeUnit)- 一个 TimeUnit 确定如何解释 timeout 参数。
// Java program to demonstrate offer(E e, long timeout, TimeUnit unit)
// method of ArrayBlockingQueue

import java.util.concurrent.*;

public class GFG {
    public static void main(String[] args) throws InterruptedException {

        // Creating ArrayBlockingQueue of size 2
        ArrayBlockingQueue queue = new ArrayBlockingQueue<>(2);

        // Adding elements to the queue
        queue.add("Geeks");
        queue.add("For");
        System.out.println("queue has- " + queue);
        queue.offer("Geeks");

        // Setting waiting time
        boolean flag = queue.offer("GFG", 3, TimeUnit.SECONDS);

        if(flag) {
            System.out.println("Element added successfully");
        } else {
            System.out.println("Element not added to queue "
                               + "within specified time limit");
        }
        System.out.println("queue now contains: " + queue);
    }
}

输出:

queue has- [Geeks, For]
Element not added to queue within specified time limit
queue now contains: [Geeks, For]

返回值: 该方法在添加成功时返回True,如果指定的等待时间过去而空间不足则返回false。

异常: 该方法抛出两种类型的异常:

  • InterruptedException – 如果等待时被打断。
  • NullPointerException – 如果指定的元素为null。

以下程序说明了ArrayBlockingQueue的offer(E element,long timeout,TimeUnit unit)方法:

 //程序演示offer(E e,long timeout,TimeUnit unit)的方法
// ArrayBlockingQueue
// 
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
// 
public class GFG {
    public static void main(String [] args)
                  throws InterruptedException
    {
        //定义ArrayBlockingQueue的容量
        int capacity = 5;
 
        //创建ArrayBlockingQueue的对象
        ArrayBlockingQueue  queue =
            new ArrayBlockingQueue  (容量);
 
        //向具有5个元素的ArrayBlockingQueue添加元素
        // Timeout的值为10秒
        System.out.println("adding 423: " +
              queue.offer (433,10,TimeUnit.SECONDS) ) 
        System.out.println("adding 456: " +
              queue.offer (456,10,TimeUnit.SECONDS) ) 
        System.out.println("adding 987: " +
              queue.offer (987,10,TimeUnit.SECONDS) ) 
        System.out.println("adding 578: " +
              queue.offer (578,10,TimeUnit.SECONDS) ) 
        System.out.println("adding 852: " +
              queue.offer (852,10,TimeUnit.SECONDS) ) 
 
        //检查队列是否已满
        if(queue.remainingCapacity()== 0) {
            System.out.println("queue is full");
            System.out.println("queue contains "+ queue);
        }
        else {
            System.out.println("queue is not full");
            System.out.println("queue contains "+ queue);
        }
        //尝试添加更多元素
        System.out.println("adding 546: " +
                  queue.offer (546,10,TimeUnit.SECONDS) ) 
    }
}

输出:

adding 423: true
adding 456: true
adding 987: true
adding 578: true
adding 852: true
queue is full
queue contains [433, 456, 987, 578, 852]
adding 546: false

参考资料: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ArrayBlockingQueue.html#offer(E)

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程