一、堵塞队列

  Java定义了堵塞队列的接口java.util.concurrent.BlockingQueue,堵塞队列是一个指定长度的队列,当试图向队列中添加元素而队列已满,或者是想从队列移出元素而队列为空的时候,堵塞队列导致线程堵塞。

  在协调多个线程之间的合作时,堵塞队列是一个有用的工具。

  堵塞队列的方法分为三类,取决于当队列满或空时它们的相应方式。

    1、如果将队列当作线程管理工具使用,用到put()(添加一个元素)和take()(移出并返回头元素)方法。

    2、当试图向满的队列中添加或从从空的队列中移出元素时,用到add()、remove()(移出并返回头元素)、element()(返回队列的头元素)。

    3、在一个线程中,队列会在任何时候空或满时,用offer()(添加一个元素并返回true)、poll()(移出并返回队列的头元素)、peek()(返回队列的头元素)替代。这些方法如果不能完成任务,不会抛出异常,只会给出一个错误。

简单的例子:

  QueueTest.java

 package Thread;

 import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; public class QueueTest {
public static void main(String[] args)throws InterruptedException{
BlockingQueue bqueue=new ArrayBlockingQueue(20);
for (int i=0;i<30;i++){
bqueue.put(i);
System.out.println("向堵塞队列中添加了元素:"+i);
}
System.out.println("程序运行结束,即将退出---");
}
}

  结果为:

 向堵塞队列中添加了元素:0
向堵塞队列中添加了元素:1
向堵塞队列中添加了元素:2
向堵塞队列中添加了元素:3
向堵塞队列中添加了元素:4
向堵塞队列中添加了元素:5
向堵塞队列中添加了元素:6
向堵塞队列中添加了元素:7
向堵塞队列中添加了元素:8
向堵塞队列中添加了元素:9
向堵塞队列中添加了元素:10
向堵塞队列中添加了元素:11
向堵塞队列中添加了元素:12
向堵塞队列中添加了元素:13
向堵塞队列中添加了元素:14
向堵塞队列中添加了元素:15
向堵塞队列中添加了元素:16
向堵塞队列中添加了元素:17
向堵塞队列中添加了元素:18
向堵塞队列中添加了元素:19

二、栈

  对于堵塞栈,与堵塞队列相似,不同点是后入先出的结构,每次操作的都是栈顶,而队列是先进先出的结构,每次操作的对列头。堵塞栈定义了新街口java.util.concurrentBlockingDeque。例子:

  DequeTest.java

 package Thread;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
public class QueueTest {
public static void main(String[] args)throws InterruptedException{
BlockingDeque bqueue=new LinkedBlockingDeque(20);
for (int i=0;i<30;i++){
bqueue.put(i);
System.out.println("向堵塞队列中添加了元素:"+i);
}
System.out.println("程序运行结束,即将退出---");
}
}

  结果为:

 向堵塞栈中添加了元素:0
向堵塞栈中添加了元素:1
向堵塞栈中添加了元素:2
向堵塞栈中添加了元素:3
向堵塞栈中添加了元素:4
向堵塞栈中添加了元素:5
向堵塞栈中添加了元素:6
向堵塞栈中添加了元素:7
向堵塞栈中添加了元素:8
向堵塞栈中添加了元素:9
向堵塞栈中添加了元素:10
向堵塞栈中添加了元素:11
向堵塞栈中添加了元素:12
向堵塞栈中添加了元素:13
向堵塞栈中添加了元素:14
向堵塞栈中添加了元素:15
向堵塞栈中添加了元素:16
向堵塞栈中添加了元素:17
向堵塞栈中添加了元素:18
向堵塞栈中添加了元素:19

Java线程:堵塞队列与堵塞栈的更多相关文章

  1. Java线程安全队列BlockingQueue

    线程安全队列BlockingQueue 用法跟普通队列没有区别,只是加入了多线程支持. 这里主要说说add和put,以及poll和take的区别: add和put都是用来忘队列里面塞东西的,而poll ...

  2. java 线程 被相互排斥堵塞、检查中断演示样例解说----thinking java4

    package org.rui.thread.block; /** * 被相互排斥堵塞 就像在interrupting.java中看到的,假设你偿试着在一个对象上调用其synchronized方法, ...

  3. Java线程安全队列Queue实现原理

    原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...

  4. Java线程池队列吃的太饱,撑着了咋整?java 队列过大导致内存溢出

    Java的Executors框架提供的定长线程池内部默认使用LinkedBlockingQueue作为任务的容器,这个队列是没有限定大小的,可以无限向里面submit任务. 当线程池处理的太慢的时候, ...

  5. 跟我学Java多线程——线程池与堵塞队列

    前言 上一篇文章中我们将ThreadPoolExecutor进行了深入的学习和介绍,实际上我们在项目中应用的时候非常少有直接应用ThreadPoolExecutor来创建线程池的.在jdk的api中有 ...

  6. CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件

    Java多线程编程是很考验一个程序猿水平的. 传统的WEB程序中.由于框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将全部的注意力放到了业务实现上.我们不过依照业务逻辑的要求.不停的积累自 ...

  7. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  8. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  9. java线程详解

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

随机推荐

  1. unity3d 多人寻路堵塞堆叠问题

    使用unity提供的NavMeshAgent寻路,当有多个agent一起寻路时总会出现堵塞堆叠的问题. 本人使用了一个非常粗劣简单的方案解决此问题,当然跟魔兽的寻路完全没得比,但保证有比较好的性能,且 ...

  2. Freemodbus 1.5

    源:http://blog.sina.com.cn/s/blog_4935209001012eax.html 网站位置:http://www.freemodbus.org/index.php?lang ...

  3. JS常用校验方法(判断输入框是否为空,数字,电话,邮件,四舍五入等)

    JS常用校验方法: 1.判断输入框是否为空,为空时弹出提示框 2.关闭窗口 3.检查输入字符串是否为数字 4.强制把大写转换成小写 5.手机号码校验,长度为11位数字. 6.电子邮件校验 7.电话号码 ...

  4. bi api 软件

    https://www.interactivebrokers.com.hk/cn/index.php?f=5234&ns=T

  5. PHP处理多表查询时的SQL语句拆分与重新组装

    在自己写框架时候会发现,多表查询组装SQL语句<?php $pre = "pre_"; $aid = "44"; $data = array(" ...

  6. 使用maven管理后,依然找不到需要的jar包

    使用maven管理后,依然报错,找不到,比如如下错误java.lang.ClassNotFoundException: org.springframework.web.context.ContextL ...

  7. 从url中提取参数名和参数值(转)

    在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到.js的实现方法如下: function getValue(url, name) { var reg = new RegExp('(\\?| ...

  8. (中等) HDU 4979 A simple math problem. , DLX+重复覆盖+打表。

    Description Dragon loves lottery, he will try his luck every week. One day, the lottery company brin ...

  9. (中等) POJ 1084 Square Destroyer , DLX+可重复覆盖。

    Description The left figure below shows a complete 3*3 grid made with 2*(3*4) (=24) matchsticks. The ...

  10. MySQL中 InnoDB 和 MyISAM 小结

    转:http://blog.csdn.net/ithomer/article/details/5136982 部分内容: InnoDB和MyISAM的差别 InnoDB和MyISAM是许多人在使用My ...