一、堵塞队列

  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. MySQL中文乱码修改

    一.从服务端进行修改 show variables like "%char%"; 然后可能显示如下信息,注意红色部分,不同的用户可能实际情况不同,但是需要保证除了 filesyst ...

  2. service引用

    已引用 attachmentManager 为例 ApplicationContext applicationContext = WebApplicationContextUtils.getWebAp ...

  3. Struts2--Result类型

    4种 result类型: dispatcher, redirect, chain, redirectAction dispatcher, redirect只能跳转到jsp等页面 chain,redir ...

  4. js中的 AOP

    原文 :http://blog.csdn.net/notejs/article/details/8770575 面向切面的编程(AOP)还是有点意思的,可以在不修改原有代码的情况下增加新功能.有一些j ...

  5. 小P的强力值

    小P的强力值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在虚拟世界中有一只小宠物小P.小P有K种属性,每种属性的初始值为Ai.小Ho送给了小Hi若干颗药丸,每 ...

  6. [转]ASP.NET Core 1 Deploy to IIS

    本文转自: http://webmodelling.com/webbits/aspnet/aspnet-deploy-iis.aspx 15 Sep 2016. This tutorial will ...

  7. pom文件说明

    http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html

  8. Mac下node.js卸载方法收集

    brew的安装方式 直接通过一条命令 brew uninstall nodejs 官网下载pkg安装包的 通过这条命令 sudo rm -rf /usr/local/{bin/{node,npm},l ...

  9. tp框架中的静态验证

    //制定命名空间在Home 模块下Model文件夹下 如:namespace Home\Model; //引用父类 如:use Think\Model; //实例化表 如:class ZhuCeMod ...

  10. S3C2440 ADC详解

    S3C2440拥有八通道的十位ADC, 最大转换率为2.5MHz A/D转换器时钟下的500KSPS.A/D转换器支持片上采样-保持功能和掉电模式的操作. 八个通道中有四个通道适用于电阻屏的触摸屏触摸 ...