📌  相关文章
📜  Java中的 LinkedBlockingQueue take() 方法及示例(1)

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

Java中的 LinkedBlockingQueue take() 方法及示例

LinkedBlockingQueue是Java中一个线程安全的阻塞队列,它实现了BlockingQueue接口,提供了丰富的操作方法,take()是其中之一,本文将介绍LinkedBlockingQueue的take()方法及示例。

take()方法介绍

LinkedBlockingQueue的take()方法是一个阻塞方法,其作用是从队列中取出并删除队首元素,如果队列为空,则阻塞线程,直到有元素可用为止。

take()方法的定义如下:

public E take() throws InterruptedException

其中,E是队列中元素的类型,InterruptedException是线程中断异常,表示线程在阻塞时被中断。

take()方法示例

下面是一个使用LinkedBlockingQueue的take()方法的示例。

import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueDemo {
    
    public static void main(String[] args) throws InterruptedException {
        
        LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(3);
        
        // 生产者线程 put 数据
        Thread producerThread = new Thread(() -> {
            try {
                queue.put(1);
                queue.put(2);
                queue.put(3);
                System.out.println("Producer: 1, 2, 3 has been added to queue");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "ProducerThread");
        
        // 消费者线程 take 数据
        Thread consumerThread = new Thread(() -> {
            try {
                System.out.println("Consumer: begin to take data");
                int data1 = queue.take();
                int data2 = queue.take();
                int data3 = queue.take();
                System.out.println("Consumer: " + data1 + ", " + data2 + ", " + data3 + " has been taken from queue");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "ConsumerThread");
        
        // 启动线程
        producerThread.start();
        consumerThread.start();
        
        // 等待线程结束
        producerThread.join();
        consumerThread.join();
        
        System.out.println("Main thread exited");
    }
}

示例中,创建了一个容量为3的LinkedBlockingQueue,分别在ProducerThread和ConsumerThread中使用put()和take()方法对队列进行操作。ProducerThread依次加入了数字1、2、3,ConsumerThread依次取出了这3个数字。

由于LinkedBlockingQueue的put()方法也是阻塞方法,所以在队列满的情况下,ProducerThread会被阻塞,直到有空间可用。

总结

LinkedBlockingQueue的take()方法是一个阻塞方法,它能够保证在队列为空时阻塞线程。在实际使用中,我们可以结合put()方法进行生产者和消费者模式的设计,从而实现高效的线程通信。