Java ArrayBlockingQueue offer()方法
ArrayBlockingQueue 是有边界的、阻塞的队列,它在内部存储着由数组支持的元素。
- ArrayBlockingQueue 类是Java集合框架的一个成员。
- 有界意味着它将有一个固定的大小,你不能存储超过队列容量的元素数量。
- 该队列也遵循FIFO(先进先出)规则来存储和移除队列中的元素。
- 如果你试图把一个元素放入一个满的队列或从一个空的队列中取出一个元素,那么队列将阻止你。
根据传递给它的参数,有两种类型的offer()方法。
- 如果队列没有满,offer(E element )方法将作为参数传递给方法的元素在这个队列(ArrayBlockingQueue)的尾部。当添加操作成功时,它返回true,如果队列已满,则返回false。这个方法比add()方法更好,因为add方法在队列满的时候会抛出错误,而offer()方法在这种情况下会返回false。
语法:
public boolean offer(E e)
参数:该方法需要一个参数,元素。这指的是要添加到队列中的元素。
返回值: 如果添加操作成功,该方法返回True,如果该队列已满,则返回false。
异常:如果指定的元素为空,该方法会抛出NullPointerException。
下面的程序说明了ArrayBlockingQueue的offer(E element)方法。
示例 1:
// Demonstrating offer(E element) method of ArrayBlockingQueue
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
public static void main(String[] args) {
// Define capacity of ArrayBlockingQueue
int capacity = 5;
// Create object of ArrayBlockingQueue
ArrayBlockingQueue<Integer> queue =
new ArrayBlockingQueue<Integer>(capacity);
// Add 5 elements to ArrayBlockingQueue
System.out.println("adding 423: "+queue.offer(423));
System.out.println("adding 243: "+queue.offer(243));
System.out.println("adding 237: "+queue.offer(237));
System.out.println("adding 867: "+queue.offer(867));
System.out.println("adding 23: "+queue.offer(23));
// Check whether queue is full or not
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);
}
// Try to add more elements
System.out.println("adding 123: "+queue.offer(123));
System.out.println("adding 321: "+queue.offer(321));
}
}
输出:
adding 423: true
adding 243: true
adding 237: true
adding 867: true
adding 23: true
queue is full
queue contains [423, 243, 237, 867, 23]
adding 123: false
adding 321: false
示例 2:
// Program Demonstrate offer(E e) method of ArrayBlockingQueue
import java.util.concurrent.ArrayBlockingQueue;
public class GFG {
// create a User Object with name and age as an attribute
public class User {
public String name;
public String age;
User(String name, String age)
{
this.name = name;
this.age = age;
}
}
// Main Method
public static void main(String[] args)
{
GFG gfg = new GFG();
gfg.offerExample();
}
// Method to give example of contains function
public void offerExample()
{
// Define the capacity of ArrayBlockingQueue
int capacity = 5;
// Create object of ArrayBlockingQueue
ArrayBlockingQueue<User> queue =
new ArrayBlockingQueue<User>(capacity);
// Create user objects
User user1 = new User("Aman", "24");
User user2 = new User("Amar", "23");
User user3 = new User("Sanjeet", "25");
User user4 = new User("Suvo", "26");
User user5 = new User("Ravi", "22");
// Add Objects to ArrayBlockingQueue
System.out.println("adding user having name = "
+ user1.name + ": " + queue.offer(user1));
System.out.println("adding user having name = "
+ user2.name + ": " + queue.offer(user2));
System.out.println("adding user having name = "
+ user3.name + ": " + queue.offer(user3));
System.out.println("adding user having name = "
+ user4.name + ": " + queue.offer(user4));
System.out.println("adding user having name = "
+ user5.name + ": " + queue.offer(user5));
// Check whether the queue is full or not
if (queue.remainingCapacity() == 0) {
System.out.println("queue is full");
}
else {
System.out.println("queue is not full");
}
// Create more user objects
User user6 = new User("Ram", "20");
User user7 = new User("Mohan", "27");
// Add users in queue
System.out.println("adding user having name = "
+ user6.name + ": " + queue.offer(user6));
System.out.println("adding user having name = "
+ user7.name + ": " + queue.offer(user7));
}
}
输出:
adding user having name = Aman: true
adding user having name = Amar: true
adding user having name = Sanjeet: true
adding user having name = Suvo: true
adding user having name = Ravi: true
queue is full
adding user having name = Ram: false
adding user having name = 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 (TimeUnit)- 一个决定如何解释超时参数的TimeUnit。
返回值:该方法在添加方法成功时返回True,如果指定的等待时间过了才有空间,则返回false。
异常:该方法抛出两种类型的异常。
- InterruptedException – 如果在等待时被打断。
- NullPointerException – 如果指定的元素为空。
下面的程序说明了ArrayBlockingQueue的offer(E element, long timeout, TimeUnit unit)方法。
// Program Demonstrate offer(E e, long timeout, TimeUnit unit)
// method of ArrayBlockingQueue
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
public class GFG {
public static void main(String[] args)
throws InterruptedException
{
// Define capacity of ArrayBlockingQueue
int capacity = 5;
// Create object of ArrayBlockingQueue
ArrayBlockingQueue<Integer> queue =
new ArrayBlockingQueue<Integer>(capacity);
// Add 5 elements to ArrayBlockingQueue having
// Timeout in seconds with value 10 secs
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));
// Check whether queue is full or not
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);
}
// Try to add more elements
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)
极客教程