Java线程:堵塞队列与堵塞栈
一、堵塞队列
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线程:堵塞队列与堵塞栈的更多相关文章
- Java线程安全队列BlockingQueue
线程安全队列BlockingQueue 用法跟普通队列没有区别,只是加入了多线程支持. 这里主要说说add和put,以及poll和take的区别: add和put都是用来忘队列里面塞东西的,而poll ...
- java 线程 被相互排斥堵塞、检查中断演示样例解说----thinking java4
package org.rui.thread.block; /** * 被相互排斥堵塞 就像在interrupting.java中看到的,假设你偿试着在一个对象上调用其synchronized方法, ...
- Java线程安全队列Queue实现原理
原文链接:https://www.cnblogs.com/DreamRecorder/p/9223016.html 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.J ...
- Java线程池队列吃的太饱,撑着了咋整?java 队列过大导致内存溢出
Java的Executors框架提供的定长线程池内部默认使用LinkedBlockingQueue作为任务的容器,这个队列是没有限定大小的,可以无限向里面submit任务. 当线程池处理的太慢的时候, ...
- 跟我学Java多线程——线程池与堵塞队列
前言 上一篇文章中我们将ThreadPoolExecutor进行了深入的学习和介绍,实际上我们在项目中应用的时候非常少有直接应用ThreadPoolExecutor来创建线程池的.在jdk的api中有 ...
- CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件
Java多线程编程是很考验一个程序猿水平的. 传统的WEB程序中.由于框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将全部的注意力放到了业务实现上.我们不过依照业务逻辑的要求.不停的积累自 ...
- Java线程新特征——Java并发库
一.线程池 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...
- Java线程:概念与原理
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- java线程详解
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
随机推荐
- MySQL中文乱码修改
一.从服务端进行修改 show variables like "%char%"; 然后可能显示如下信息,注意红色部分,不同的用户可能实际情况不同,但是需要保证除了 filesyst ...
- service引用
已引用 attachmentManager 为例 ApplicationContext applicationContext = WebApplicationContextUtils.getWebAp ...
- Struts2--Result类型
4种 result类型: dispatcher, redirect, chain, redirectAction dispatcher, redirect只能跳转到jsp等页面 chain,redir ...
- js中的 AOP
原文 :http://blog.csdn.net/notejs/article/details/8770575 面向切面的编程(AOP)还是有点意思的,可以在不修改原有代码的情况下增加新功能.有一些j ...
- 小P的强力值
小P的强力值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi在虚拟世界中有一只小宠物小P.小P有K种属性,每种属性的初始值为Ai.小Ho送给了小Hi若干颗药丸,每 ...
- [转]ASP.NET Core 1 Deploy to IIS
本文转自: http://webmodelling.com/webbits/aspnet/aspnet-deploy-iis.aspx 15 Sep 2016. This tutorial will ...
- pom文件说明
http://www.blogjava.net/hellxoul/archive/2013/05/16/399345.html
- Mac下node.js卸载方法收集
brew的安装方式 直接通过一条命令 brew uninstall nodejs 官网下载pkg安装包的 通过这条命令 sudo rm -rf /usr/local/{bin/{node,npm},l ...
- tp框架中的静态验证
//制定命名空间在Home 模块下Model文件夹下 如:namespace Home\Model; //引用父类 如:use Think\Model; //实例化表 如:class ZhuCeMod ...
- S3C2440 ADC详解
S3C2440拥有八通道的十位ADC, 最大转换率为2.5MHz A/D转换器时钟下的500KSPS.A/D转换器支持片上采样-保持功能和掉电模式的操作. 八个通道中有四个通道适用于电阻屏的触摸屏触摸 ...