📜  实现 LinkedBlockingQueue API 的Java程序(1)

📅  最后修改于: 2023-12-03 15:25:09.550000             🧑  作者: Mango

LinkedBlockingQueue API 的Java程序

LinkedBlockingQueue是Java中并发包中的一种阻塞队列,与ArrayBlockingQueue类似,但更加高效。它支持两种操作:put和take,这两种操作都是阻塞的,阻塞队列的大小可以初始化,也可以不指定大小,大小为默认值Integer.MAX_VALUE。

LinkedBlockingQueue的特点
  • put和take操作都是阻塞的,当队列满了之后,put操作会阻塞,当队列为空时,take操作会阻塞;
  • 阻塞队列的大小可以初始化,也可以不指定大小,大小为默认值Integer.MAX_VALUE;
  • 阻塞队列支持多线程并发操作;
  • 使用链表作为阻塞队列的数据结构,效率比较高。
实现LinkedBlockingQueue API的Java程序

以下是一个实现LinkedBlockingQueue API的Java程序:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueExample {

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

        BlockingQueue<String> queue = new LinkedBlockingQueue<>();

        //生产者线程
        new Thread(() -> {
            try {
                //向队列中添加元素
                queue.put("Java");
                queue.put("Python");
                queue.put("C++");
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        //消费者线程
        new Thread(() -> {
            try {
                //从队列中取出元素
                System.out.println(queue.take());
                System.out.println(queue.take());
                System.out.println(queue.take());
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

首先,我们创建了一个BlockingQueue接口的对象,由于我们需要使用LinkedBlockingQueue对象,所以我们实例化了一个LinkedBlockingQueue对象来存储数据:

BlockingQueue<String> queue = new LinkedBlockingQueue<>();

然后,我们创建了两个线程,一个生产者线程,一个消费者线程,分别用于向队列中添加元素和从队列中取出元素:

//生产者线程
new Thread(() -> {
    try {
        //向队列中添加元素
        queue.put("Java");
        queue.put("Python");
        queue.put("C++");
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

//消费者线程
new Thread(() -> {
    try {
        //从队列中取出元素
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
}).start();

当向队列中添加元素时,如果队列已满,那么线程就会阻塞等待,直到队列中有空余位置可以存储元素。当从队列中取出元素时,如果队列为空,那么线程也会阻塞等待,直到队列中有元素可以取出。

总结

LinkedBlockingQueue是Java中并发包中的一种阻塞队列,支持高并发的操作,使用链表数据结构,效率比较高。通过使用LinkedBlockingQueue API,我们能够轻松地实现阻塞队列的操作,方便开发人员进行多线程编程。