Java并发编程:阻塞队列
整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html

1、什么是阻塞队列
  除了同步容器(Hashtable、Vector)、并发容器(ConcurrentHashMap、CopyOnWriteArrayList)外,还有一种容器就是阻塞队列;
  阻塞队列会在一定条件下对当前线程产生阻塞,条件消失后唤醒被阻塞的线程。
2、几种主要的阻塞队列
  ArrayBlockingQueue:基于数组实现,有界,先进先出
  LinkedBlockingQueue:基于链表实现,有界,先进先出
  PriorityBlockingQueue:基于优先级的,无解,优先级高的先出;
  DelayQueue:延时阻塞,无界,指定一定延时时间
3、非阻塞队列与阻塞队列的方法比较:
  3.1非阻塞队列(如deque,LinkedList,PriorityQueue等)
    add(E e):加入队列末尾,成功返回true,失败抛出异常;
    remove():移除并获取队首元素,为null则抛异常。
    offer(E e):成功返回true,失败返回false,好于add因为它不会只抛一个异常;
    poll():移除并获取队首元素,为空返回null,也好于remove;
    peek():获取队首元素,失败返回null;
    建议使用offer,poll,和peek。
  3.2阻塞队列:
    上述五种,且实现同步;
    put(E e):存入队尾,满则等待;
    take():取队首,队列空则等待;
    offer(E e,long timeout, TimeUnit unit):队尾存,满则等待时间,还不行返回false;
    poll(long timeout, TimeUnit unit):取队首,队列空则等待,时间到达后,返回元素,取不到返回null;
4、阻塞队列的实现原理:
   使用可重入锁ReentrantLock,调用其可中断加锁方法lockInterruptibly()

5、java实例:

  1. //非阻塞队列实现生产者消费者模式
  2. public class Test {
  3. private int queueSize = 10;
  4. private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
  5.  
  6. public static void main(String[] args) {
  7. Test test = new Test();
  8. Producer producer = test.new Producer();
  9. Consumer consumer = test.new Consumer();
  10.  
  11. producer.start();
  12. consumer.start();
  13. }
  14.  
  15. class Consumer extends Thread{
  16.  
  17. @Override
  18. public void run() {
  19. consume();
  20. }
  21.  
  22. private void consume() {
  23. while(true){
  24. synchronized (queue) {
  25. while(queue.size() == 0){
  26. try {
  27. System.out.println("队列空,等待数据");
  28. queue.wait();
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. queue.notify();
  32. }
  33. }
  34. queue.poll(); //每次移走队首元素
  35. queue.notify();
  36. System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
  37. }
  38. }
  39. }
  40. }
  41.  
  42. class Producer extends Thread{
  43.  
  44. @Override
  45. public void run() {
  46. produce();
  47. }
  48.  
  49. private void produce() {
  50. while(true){
  51. synchronized (queue) {
  52. while(queue.size() == queueSize){
  53. try {
  54. System.out.println("队列满,等待有空余空间");
  55. queue.wait();
  56. } catch (InterruptedException e) {
  57. e.printStackTrace();
  58. queue.notify();
  59. }
  60. }
  61. queue.offer(1); //每次插入一个元素
  62. queue.notify();
  63. System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
  64. }
  65. }
  66. }
  67. }
  68. }

  

  1. //阻塞队列实现生产者消费者模式
  2. public class Test {
  3. private int queueSize = 10;
  4. private ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(queueSize);
  5.  
  6. public static void main(String[] args) {
  7. Test test = new Test();
  8. Producer producer = test.new Producer();
  9. Consumer consumer = test.new Consumer();
  10.  
  11. producer.start();
  12. consumer.start();
  13. }
  14.  
  15. class Consumer extends Thread{
  16.  
  17. @Override
  18. public void run() {
  19. consume();
  20. }
  21.  
  22. private void consume() {
  23. while(true){
  24. try {
  25. queue.take();
  26. System.out.println("从队列取走一个元素,队列剩余"+queue.size()+"个元素");
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32. }
  33.  
  34. class Producer extends Thread{
  35.  
  36. @Override
  37. public void run() {
  38. produce();
  39. }
  40.  
  41. private void produce() {
  42. while(true){
  43. try {
  44. queue.put(1);
  45. System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
  46. } catch (InterruptedException e) {
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }
  52. }

  

Java并发机制(6)--阻塞队列的更多相关文章

  1. Java并发编程:阻塞队列(转载)

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  2. 【转】Java并发编程:阻塞队列

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  3. 12、Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  4. (转)Java并发编程:阻塞队列

    Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList), ...

  5. java并发编程学习: 阻塞队列 使用 及 实现原理

    队列(Queue)与栈(Stack)是数据结构中的二种常用结构,队列的特点是先进先出(First In First Out),而Stack是先进后出(First In Last Out),说得通俗点: ...

  6. java并发编程:阻塞队列

    一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列 ...

  7. Java并发容器之阻塞队列BlockingQueue

    BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满:从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空. Bloc ...

  8. Java并发编程:阻塞队列 <转>

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  9. (转)Java并发编程:阻塞队列

    原文地址: http://www.cnblogs.com/dolphin0520/p/3932906.html 一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurre ...

  10. Java并发编程之阻塞队列

    1.什么是阻塞队列? 队列是一种数据结构,它有两个基本操作:在队列尾部加入一个元素,从队列头部移除一个元素.阻塞队里与普通的队列的区别在于,普通队列不会对当前线程产生阻塞,在面对类似消费者-生产者模型 ...

随机推荐

  1. C语言中左值和右值的理解

    左值顾名思义等号左边,右值等号右边. 左值一般指的内存占用的一个符号: 右值指的是常量或者常量表达式: 当然左值也可以通过一些常用的运算符,例如加减乘除/&转化为右值 注意:不是所有的变量都能 ...

  2. Kafka与ELK实现一个日志系统

    1.概述 客户端应用程序在运行过程中可能会产生错误,例如调用服务端接口超时.客户端处理业务逻辑发生异常.应用程序突然闪退等.这些异常信息都是会产生日志记录的,并通过上报到指定的日志服务器进行压缩存储. ...

  3. web渗透绕过

    ////目录: 403 IP地址绕过与文件名绕过 登录框绕过 SQL注入绕过 文件上传绕过 RCE绕过 403 IP地址绕过与文件名绕过 X-Forwarded-For:127.0.0.1 X-For ...

  4. [题解]Codeforces Round #254 (Div. 2) A - DZY Loves Chessboard

    链接:http://codeforces.com/contest/445/problem/A 描述:一个n*m的棋盘,有一些格子不能放棋子.现在把黑白棋子往上放,要求放满且相邻格子的棋子颜色不同.输出 ...

  5. Renix绑定流详解——网络测试仪实操

    一.测试环境 使用测试仪模拟两台主机直接发流,中间有路由器.如下图,测试仪port1端口模拟的主机IP为10.1.1.2,port2端口模拟的主机IP为10.2.1.2 二.预约测试资源 打开Reni ...

  6. 5、CPU 的线程与操作系统的线程有何关系?操作系统中的进程和线程是什么关系?

    CPU中的线程和操作系统(OS)中的线程即不同,在调度的时候又有些关联.CPU中的线程,我们叫它们Thread,和OS中的线程的名字一样.它来自同步多线程(SMT,Simultaneous Multi ...

  7. C# 题目

    题目 http://blog.zhaojie.me/2011/03/my-interview-questions-for-dotnet-programmers.html 1.考察对常量和自读字段 初始 ...

  8. 聊聊第一个开源项目(内网穿透) - CProxy

    文章首发:聊聊第一个开源项目 - CProxy 作者:会玩code 初衷 最近在学C++,想写个项目练练手.对网络比较感兴趣,之前使用过ngrok(GO版本的内网穿透项目),看了部分源码,想把自己的一 ...

  9. random_sample() takes at most 1 positional argument (2 given)

    是random模块下的sample函数,而不是np.random.

  10. 进程&线程(三):外部子进程subprocess、异步IO、协程、分布式进程

    1.外部子进程subprocess python之subprocess模块详解--小白博客 - 夜风2019 - 博客园 python subprocess模块 - lincappu - 博客园 之前 ...