如何理解 Java 中的阻塞队列:从基础到高级的深度解析
    		       		warning:
    		            这篇文章距离上次修改已过430天,其中的内容可能已经有所变动。
    		        
        		                
                在Java中,阻塞队列是一个支持两个附加操作的队列:
- take方法可以阻塞,直到队列中有元素可用。
- put方法可以阻塞,直到队列中有空间可用。
这里是一个简单的实现示例,使用 ArrayBlockingQueue 作为阻塞队列:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
 
public class BlockingQueueExample {
    public static void main(String[] args) {
        BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);
 
        // 生产者线程
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    queue.put(i); // 如果队列已满,这里会阻塞等待
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }
            }
        }).start();
 
        // 消费者线程
        new Thread(() -> {
            while (true) {
                try {
                    int value = queue.take(); // 如果队列为空,这里会阻塞等待
                    System.out.println(value);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }
            }
        }).start();
    }
}在这个例子中,我们创建了一个容量为10的 ArrayBlockingQueue。生产者线程使用 put 方法向队列中添加元素,如果队列已满,则阻塞等待直到队列中有空间。消费者线程使用 take 方法从队列中取出元素,如果队列为空,则阻塞等待直到队列中有元素可取。这样,生产者和消费者可以以协调一致的方式工作,不会超出队列的容量限制,也不会因为队列为空而频繁等待。
评论已关闭