JAVA线程15

一、阻塞队列

1. 概述

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

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

遵循先进先出的原则。

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

2. 示例

1import java.util.concurrent.ArrayBlockingQueue; 2import java.util.concurrent.BlockingQueue; 3 4public class BlockingQueueTest { 5    public static void main(String[] args) { 6        final BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(5); 7        for (int i = 0; i < 2; i++) { 8            new Thread() { 9                public void run() { 10                    while (true) { 11                        try { 12                            Thread.sleep((long) (Math.random() * 1000)); 13                            System.out.println(Thread.currentThread().getName() + " 准备放数据!"); 14                            queue.put(1);// 指定的元素插入此队列的尾部,如果该队列已满,则等待可用的空间。 15                            System.out.println(Thread.currentThread().getName() + " 已经放了数据," + "队列目前有" + queue.size() + "个数据"); 16                        } catch (InterruptedException e) { 17                            e.printStackTrace(); 18                        } 19                    } 20                } 21            }.start(); 22        } 23 24        new Thread() { 25            public void run() { 26                while (true) { 27                    try { 28                        // 将此处的睡眠时间分别改为100和1000,观察运行结果,取得快/放的快 29                        Thread.sleep(1000); 30                        System.out.println(Thread.currentThread().getName() + " 准备取数据!"); 31                        queue.take();// 获取并移除此队列的头部,在元素变得可用之前一直等待(如果有必要)。 32                        System.out.println(Thread.currentThread().getName() + " 已经取走数据," + "队列目前有" + queue.size() + "个数据"); 33                    } catch (InterruptedException e) { 34                        e.printStackTrace(); 35                    } 36                } 37            } 38        }.start(); 39    } 40}

二、阻塞栈

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java并发数据结构

一.BlockingDeque阻塞双端队列(线程安全):注意ArrayDeque和LinkedList仅仅扩展了Deque,是非阻塞类型的双端队列。BlockingQueue单向队列,其内部基于ReentrantLockCondition来控制同步和"阻塞"/"唤醒"的时

JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

从Java5开始,Java提供了自己的线程池。每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor就是这样的线程池。以下是我的学习过程。首先是构造函数签名如下:\java\viewplain(http://my.oschina.net/u/1398304/admin/)

Java多线程之线程安全队列Queue

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。注:什么叫线程安全?这个首先要明确。

BlockingQueue介绍

几种类型的BlockingQueueArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。DelayQueue:一个使用优先级队列实现的无界阻塞队列。Synchro

Java多线程之线程池

 newFixedThreadPool:固定线程池,核心线程数和最大线程数固定相等,而空闲存活时间为0毫秒,说明此参数也无意义,工作队列为最大为Integer.MAX\_VALUE大小的阻塞队列。当执行任务时,如果线程都很忙,就会丢到工作队列等有空闲线程时再执行,队列满就执行默认的拒绝策略 newCachedThreadPool:带缓冲