Java 中的 LinkedBlockingDeque offerFirst() 方法

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() 方法可以用来实现生产者-消费者模式。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程