一、堵塞队列

  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. 转:web_custom_request 函数

    语法:Int web_custom_request (const char *RequestName, <List of Attributes>, [EXTRARES, <List ...

  2. API 友好

    API友好 新版ThinkPHP针对API开发做了很多的优化,并且不依赖原来的API模式扩展. 数据输出 新版的控制器输出采用Response类统一处理,而不是直接在控制器中进行输出,通过设置defa ...

  3. Padding和父子继承宽高之间的关系

    1.父子之间宽高的继承关系 父亲有一个宽高,儿子若不设定宽高会继承,继承宽的100%,高度靠自己内容撑开. 2.padding对儿子宽的影响 看代码: <style> .father{ w ...

  4. after和before的属性妙用

    ::after或::before设置它们的样式时有一个content这个属性这里可以写attr(data-label)其中data-label是标签上设置的data属性里的数据content:attr ...

  5. 在MAC下配置MySQL 5.7 数据库的编码问题

    1.MySQL 5.7 for MAC 默认没有my.cnf文件 ,首先 新建my.cnf文件: 2.在my.cnf文件追加 [mysqld] character-set-server=utf8mb4 ...

  6. [iOS]C语言技术视频-04-程序循环结构(while{})

    下载地址: 链接: http://pan.baidu.com/s/1o6imQ4U 密码: imuy

  7. hibernate---联合主键关联

    被主导方wife有两个主键: package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persistenc ...

  8. Web 网站 故障常用分析命令

    系统连接状态篇: 1.查看TCP连接状态 netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn netstat -n | awk '/^tcp/ { ...

  9. tinyxml2库的使用--MFC工程

    在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库, ...

  10. linux中vi和vim编辑工具

    linux中知名的还有emacs,功能比vim还要强大 vim 如果文件存在vim是打开这个文件,若果不存在,则先新建再打开 命令模式:任何模式都可以通过Esc回到命令模式,命令模式可以通过命令进行选 ...