JDK提供了7中阻塞队列,这里介绍其中3中,剩余的以此类推原理相同。

1.ArrayBlockingQueue

package com.seeyon.queue;

import java.util.concurrent.ArrayBlockingQueue;

/**
* Created by yangyu on 16/11/27.
*/ /**
* ArrayBlockingQueue是数组结构组成的有界阻塞队列
* 当队列已经满了的时候,put操作会阻塞当前线程,直到队列发生出队操作然后会唤醒put线程在入队
* 当队列为空的时候,take操作会阻塞当前线程,直到队列发生入队操作后会唤醒take线程进行出队
*/
public class TestArrayBlockingQueue {
public static void main(String[] args) {
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue(1); try {
queue.put("1111");
/**
* 该操作会被阻塞,知道队列发生出队操作
*/
queue.put("2222");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}

2.LinkedBlockingQueue:链表实现的有界阻塞队列

3.PriorityBlockingQueue:支持优先级的无界阻塞队列

4.DelayQueue

package com.seeyon.queue;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.NANOSECONDS; /**
* Created by yangyu on 16/11/27.
*/ /**
* DelayQueue是一个支持延时获取元素的无界队列
* DelayQueue可以用于如下场景:
* 1.缓存系统的的设计:用DelayQueue保存缓存元素的有效期,用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取到元素,说明该元素过期了
* 2.定时任务调度:使用DelayQueue保存当天会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,TimerQueue就是使用DelayQueue实现的
* DelayQueue的原理:
* 1.当线程put元素的时候,DelayQueue会对你put的元素通过其本身的compareTo方法进行排序,延时时间越短的顺序越靠近队列头部
* 2.当线程take元素的时候,DelayQueue会检测当前是否有Thread已经在等待队头元素了,如果有的话,那么只能阻塞当前前程,等已经取到队头
* 的Thread完成以后再唤醒。
* 如果没有Thread在等待队头元素的话,那么会查询一下队头元素还剩多少Delay时间,并且将当前线程设置为队头等待线程,然后让当前线程wait剩余
* Delay时间后在来获取队头元素。
*/
public class TestDelayQueue {
public static void main(String[] args) {
DelayQueue<Message> delayQueue = new DelayQueue<>();
delayQueue.put(new Message(2000,"yangyu")); try {
System.out.println(delayQueue.take());
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("end");
} private static class Message implements Delayed{ private long nanoTime; private String data; Message(long millisTime ,String data){
this.nanoTime = now()+millisTime*(1000*1000);
this.data = data;
} private final long now(){
return System.nanoTime();
} @Override
public long getDelay(TimeUnit unit) {
return unit.convert(nanoTime - now(), NANOSECONDS);
} @Override
public int compareTo(Delayed other) {
if (other == this) // compare zero if same object
return 0;
if (other instanceof Message) {
Message x = (Message) other;
long diff = nanoTime - x.nanoTime;
if (diff < 0)
return -1;
else if (diff > 0)
return 1;
else
return 1;
}
long diff = getDelay(NANOSECONDS) - other.getDelay(NANOSECONDS);
return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
}
}
}

5.SynchronousQueue

import java.util.concurrent.SynchronousQueue;

/**
* Created by yangyu on 16/11/27.
*/ /**
* SynchronousQueue是一个不存储数据的队列,只是做数据的的传递工作
* 同步队列,一个put操作必须等待一个take操作,否则线程被阻塞
* 同样,一个take操作必须等待一个put操作,否则线程被阻塞
*
* Executors中newCachedThreadPool()(可缓存线程池),就是使用的SynchronousQueue
* 当一个任务被放入可缓存线程池以后,会调用SynchronousQueue的offer方法来判断是否有正在等待取任务的线程
* offer方法:如果有线程正在等待取任务则将任务交给该线程并且返回true,如果没有线程等待取任务则返回false
* 如果没有正在等待的线程,那么可缓存线程池会重新启动一个线程来执行这个任务
* 当该线程执行完任务以后,会去SynchronousQueue队列中获取数据,等待60s,直到60s还未获取到任务则就自行关闭了
*/
public class TestSynchronousQueue {
public static void main(String[] args) {
SynchronousQueue<String> strings = new SynchronousQueue<>();
Thread t =new Thread(()->{
try {
/**
* 该take操作会被阻塞,直到后面的strings.put("yangyu")操作后,当前线程才会被唤醒
*/
System.out.println(strings.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
});
t.start(); try {
Thread.sleep(2000);
/**
* 唤醒阻塞线程并且传递数据
*/
strings.put("yangyu");
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("完成"); }
}

6.LinkedTransferQueue

7.LinkedBlockingDeqeue:是一个链表结构组成的双向阻塞队列,可以从队列的两端插入或者移出元素。

Java--concurrent并发包下阻塞队列介绍的更多相关文章

  1. Java中常用的七个阻塞队列介绍第一篇

    Java中常用的七个阻塞队列介绍第一篇 在上一篇我们对Java中的队列分类做了简单的介绍.本文咱们主要来聊聊阻塞队列中的七个常用子类.这七个阻塞队列的学习步骤:先看源码,分析完源码之后,我们再来对每个 ...

  2. Java中常用七个阻塞队列的总结

    Java队列总结 通过前面文章的学习,我们对Java中常用队列做了介绍.本文,咱们来对队列做个总结吧. 首先,我们介绍了现实生活中的实际场景(排队买票等),来告诉我们为什么需要使用队列. 队列是一种先 ...

  3. 9.并发包非阻塞队列ConcurrentLinkedQueue

    jdk1.7.0_79  队列是一种非常常用的数据结构,一进一出,先进先出. 在Java并发包中提供了两种类型的队列,非阻塞队列与阻塞队列,当然它们都是线程安全的,无需担心在多线程并发环境所带来的不可 ...

  4. 最全java多线程总结3——了解阻塞队列和线程安全集合不

      看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是 ...

  5. JAVA多线程提高十二:阻塞队列应用

    一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...

  6. JAVA多线程学习十五 - 阻塞队列应用

    一.类相关属性 接口BlockingQueue<E>定义: public interface BlockingQueue<E> extends Queue<E> { ...

  7. java多线程(8)---阻塞队列

    阻塞队列 再写阻塞列队之前,我写了一篇有关queue集合相关博客,也主要是为这篇做铺垫的. 网址:[java提高]---queue集合  在这篇博客中我们接触的队列都是非阻塞队列,比如Priority ...

  8. java线程(7)——阻塞队列BlockingQueue

    回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...

  9. 25、Java并发性和多线程-阻塞队列

    以下内容转自http://ifeve.com/blocking-queues/: 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操 ...

随机推荐

  1. Mybatis中SqlMapper配置的扩展与应用(2)

    三.子表删除兼容问题 这个问题,使用SQL配置函数不太好处理,而且就算使用SQL配置函数,也不够直观,有点自动生成SQL的意味,太Hibernate了(不过要是可以兼收Hibernate和Mybati ...

  2. 【SQL】姗姗来迟的SQL Server 安装图解

     逆天今天被人拉过去装了个数据库...顺便就记录一下安装过程吧,一直想发一直没时间弄,今天就发下安装过程吧,2012和2008安装过程一样的 [注意安装细节]         安装过程中如果出现问题参 ...

  3. Oracle 11g系列:函数与存储过程

    1.函数 Oracle中的函数分为两类:系统函数和自定义行数.对于自定义函数,函数的传入参数可以没有,如果有,一定要明确其数据类型.函数传入参数不能在函数内部进行修改.函数必须有返回值,并且返回值必须 ...

  4. PNG使用技巧 PNG的使用技巧

    PNG的格式和透明度 这个Fireworks会比较清楚,打开Fireworkd优化面板,可以清楚看到png有3种不同深度的格式:png8.png24.png32. 其中,在优化面板选择png8,可发现 ...

  5. mongodb简介与增删该查

    一.简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 将数据存储为一个文档,数据 ...

  6. HTML5的学习--performance获取加载时间的工具

    前段时间因为项目需要获取页面加载的时间,就去看了下HTML5中的performane. 可以用其获得页面详细的加载时间. 关于performance的详细内容可以查看 http://www.cnblo ...

  7. 15个来自 CodePen 的酷炫 CSS 动画效果【下篇】

    CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...

  8. CSS3 过渡特性创建信封效果的联系表单

    最近给大家分享 CSS3 效果比较多,都是充分运用了 CSS3 来实现的.通过 CSS3 的新特性,我们创作出好的交互和效果的可能性大大增加.这篇文章中,我想与大家分享使用 CSS3 过渡特性实现的信 ...

  9. Azure ARM (12) ARM模式下,在负载均衡器上设置多个公网IP地址

    <Windows Azure Platform 系列文章目录> 最近在帮助一个客户设置WAF (Web Application Firewall),WAF厂商要求在负载均衡器上,设置多个公 ...

  10. Python处理JSON

    从开源中国的博客搬来,合并博客 一.JSON是什么? JSON是一种轻量级的数据交换格式 二.Python处理JSON的思维 其实很容易理解,无非是将数据编成JSON格式数据和吧JSON格式的数据解析 ...