Java 中的 LinkedBlockingDeque offerFirst() 方法
LinkedBlockingDeque 简介
LinkedBlockingDeque 是 Java 中的一个双向队列,它继承于 AbstractQueue,实现了 BlockingQueue 接口,是基于链表实现的。
LinkedBlockingDeque 支持线程的并发访问,加锁机制保证了线程安全。同时,LinkedBlockingDeque 可以作为高性能内存有限的缓存使用。
offerFirst() 方法的功能
offerFirst() 方法用于向队列头部添加元素,如果队列已满则会一直阻塞,直到队列有空闲位置,或线程被中断或超时。
下面是 addFirst() 方法与 offerFirst() 方法的区别:
- addFirst() 方法:在队列头部添加元素,如果队列已满,则直接抛出异常。
- offerFirst() 方法:在队列头部添加元素,如果队列已满,则一直阻塞,直到队列有空闲位置,或线程被中断或超时。
offerFirst() 方法语法
offerFirst() 方法的语法如下:
public void offerFirst(E e) throws InterruptedException
方法参数 e 是要添加的元素。
offerFirst() 方法示例
下面是一个使用 offerFirst() 方法实现的生产者-消费者模型。生产者不断产生数据,添加到队列头部;消费者从队列尾部取出数据进行处理。
生产者代码:
import java.util.concurrent.LinkedBlockingDeque;
public class Producer implements Runnable {
private LinkedBlockingDeque<String> queue;
public Producer(LinkedBlockingDeque<String> queue) {
this.queue = queue;
}
@Override
public void run() {
int i = 0;
while (true) {
String data = "data" + i++;
try {
queue.offerFirst(data);
System.out.println(Thread.currentThread().getName() + " produce " + data);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
消费者代码:
import java.util.concurrent.LinkedBlockingDeque;
public class Consumer implements Runnable {
private LinkedBlockingDeque<String> queue;
public Consumer(LinkedBlockingDeque<String> queue) {
this.queue = queue;
}
@Override
public void run() {
while (true) {
try {
String data = queue.takeLast();
System.out.println(Thread.currentThread().getName() + " consume " + data);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
测试代码:
import java.util.concurrent.LinkedBlockingDeque;
public class Test {
public static void main(String[] args) {
LinkedBlockingDeque<String> queue = new LinkedBlockingDeque<>(5);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
Thread t1 = new Thread(producer, "producer");
Thread t2 = new Thread(consumer, "consumer");
t1.start();
t2.start();
}
}
结论
offerFirst() 方法可以用来实现在队列头部添加元素的操作,如果队列已满,则一直阻塞,直到队列有空闲位置,或线程被中断或超时。在多线程编程中,offerFirst() 方法可以用来实现生产者-消费者模式。