Java中的ArrayBlockingQueue offer()方法
ArrayBlockingQueue 是一个有界的、阻塞的队列,它将元素存储在由数组支持的内部。
- ArrayBlockingQueue 类是Java集合框架的成员。
- 有界意味着它的大小固定,您不能在队列的容量之外存储更多的元素。
- 队列还遵循FIFO(先进先出)规则,用于存储和删除队列中的元素。
- 如果您尝试在满队列中放置一个元素或从空队列中取出一个元素,则队列将阻塞您。
offer()方法有两种类型,取决于传递给它的参数:
- 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)
极客教程