JAVA线程15 - 新特性:阻塞队列&阻塞栈

一、阻塞队列

1. 概述

阻塞队列是Java5线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue。

阻塞队列是一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队列为空时候,请求队列元素的操作同样会阻塞等待,直到有可用元素为止。

遵循先进先出的原则。

阻塞队列有很多实现类,用来满足各种复杂的需求:ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue,SynchronousQueue ,API差别也很小。

2. 示例

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueTest {
    public static void main(String[] args) {
        final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5);
        for (int i = 0; i < 2; i++) {
            new Thread() {
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep((long) (Math.random() * 1000));
                            System.out.println(Thread.currentThread().getName() + "  准备放数据!");
                            queue.put(1);// 指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。
                            System.out.println(Thread.currentThread().getName() + "  已经放了数据," + "队列目前有" + queue.size() + "个数据");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
        }

        new Thread() {
            public void run() {
                while (true) {
                    try {
                        // 将此处的睡眠时间分别改为100和1000,观察运行结果,取得快/放的快
                        Thread.sleep(1000);
                        System.out.println(Thread.currentThread().getName() + "  准备取数据!");
                        queue.take();// 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。
                        System.out.println(Thread.currentThread().getName() + "  已经取走数据," + "队列目前有" + queue.size() + "个数据");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

二、阻塞栈

对于阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头。

这里要特别说明一点的是,阻塞栈是Java6的新特征。

Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现类也比较多,具体可以查看JavaAPI文档。

你可能感兴趣的:(JAVA线程15 - 新特性:阻塞队列&阻塞栈)