📅  最后修改于: 2023-12-03 15:16:23.911000             🧑  作者: Mango
LinkedBlockingQueue是Java中一个线程安全的阻塞队列,它实现了BlockingQueue接口,提供了丰富的操作方法,take()是其中之一,本文将介绍LinkedBlockingQueue的take()方法及示例。
LinkedBlockingQueue的take()方法是一个阻塞方法,其作用是从队列中取出并删除队首元素,如果队列为空,则阻塞线程,直到有元素可用为止。
take()方法的定义如下:
public E take() throws InterruptedException
其中,E是队列中元素的类型,InterruptedException是线程中断异常,表示线程在阻塞时被中断。
下面是一个使用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()方法进行生产者和消费者模式的设计,从而实现高效的线程通信。