非阻塞无界队列

ConcurrentLinkedQueue

 

  public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedQueue queue=new ConcurrentLinkedQueue();
queue.add(1);//内部调用offer
queue.offer(1);
queue.remove();//如果队里为空会报java.util.NoSuchElementException
queue.peek();//拿队列元素 但不删除
queue.poll();获取队列元素并删除如果没有则是null
}

阻塞队列

阻塞队列 指的是像队列添加元素 如果满了则阻塞等待队列容器有空间再往里面添加元素。或则 队列为空往容器里面取元素 则阻塞等待队列里面有元素取出‘

方法。

JDK7提供了7个阻塞队列

  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:支持延时的队列
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

常用方法

添加

boolean add 如果队列满了add则抛出异常

boolean offer 如果队列满了 可以设置阻塞时间

void put 如果队列满了则一直阻塞

获取队列元素并移除

Integer remove  如果队列为空 则抛出异常

Integer poll   如果队列为空可设置阻塞时间

void take  如果队列为空 一直阻塞

获取队列元素不移除

element  如果队列为空抛出异常

 peek 如果队列为空则获的null

ArrayBlockingQueue

使用数组实现 先进先出的队列。提供2个构造参数,默认不保证访问者公平的访问队列,就是调用添加方法 默认不是按先阻塞的线程 先存。  或者移除 不是按先阻塞的线程先获取并移除 可以通过ArrayBlockingQueue fairQueue = new  ArrayBlockingQueue(1000,true); 设置为true保证公平性

LinkedBlockingQueue

使用链表实现 跟ArrayBolckingQueue的区别则是

ArrayBolckingQueue:

  1.一个是生产者和消费者使用的是同一把锁。

  2.初始化必须指定大小

3.插入时直接将对象插入

LinkedBlockingQueue:

  1.则是使用生产者使用一把锁 消费者使用一把锁

2.可以不指定容器大小 但是最大值是Integer.MAX_VALUE

3.插入时将对象转为Node插入

PriorityBlockingQueue

拥有优先级排序的无界队列。需要实现comparator接口。

public class Student implements Comparable<Student> {
public Integer age;
public Student(Integer age){
this.age=age;
}
@Override
public int compareTo(Student stu) {
if(age < stu.age)
{
return -1;
}else
{
if(age > stu.age)
{
return 1;
}else
{
return 0;
}
}
}
}
   PriorityBlockingQueue<Student> queue=new PriorityBlockingQueue<Student>();
queue.add(new Student(1));
queue.add(new Student(3));
queue.add(new Student(5));
queue.add(new Student(0));
System.out.println(queue.poll().age);
System.out.println(queue.poll().age);
System.out.println(queue.poll().age);
System.out.println(queue.poll().age);

输出

0
1
3
5

DelayQueue

支持延时的无界阻塞队列 需要实现delay接口

public class Message implements Delayed {
private final long expire; //到期时间
private final String msg; //数据 public Message( long expire, String msg) {
this.expire = expire;
this.msg = msg;
} /**
* 需要实现的接口,获得延迟时间 用过期时间-当前时间
* @param unit
* @return
*/
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(this.expire - System.currentTimeMillis() , TimeUnit.MILLISECONDS);
} @Override
public int compareTo(Delayed other) {
return (int) (this.getDelay(TimeUnit.MILLISECONDS) -other.getDelay(TimeUnit.MILLISECONDS));
} public long getExpire() {
return expire;
} public String getMsg() {
return msg;
}
}
    public static void main(String[] args) throws InterruptedException {
DelayQueue<Message> queue=new DelayQueue<Message>(); Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE, 1);
Message message=new Message(nowTime.getTime().getTime(),"哈哈哈");
queue.add(message);
nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE, 3);
message=new Message(nowTime.getTime().getTime(),"哈哈哈3");
queue.add(message);
nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE, 2);
message=new Message(nowTime.getTime().getTime(),"哈哈哈2");
queue.add(message);
while (true) {
Message message1= queue.take();
System.out.println(message1.getMsg());
}
}

SynchronousQueue

没有容量的队列。生产者生产立即推送给消费者

 public static void main(String[] args) throws InterruptedException {
SynchronousQueue<String> queue=new SynchronousQueue<String>();
new Thread(new Runnable() {
@Override
public void run() {
int i=0;
while (true){
try {
Thread.sleep(1000);
queue.put(Integer.toString(i));
} catch (Exception e) {
e.printStackTrace();
}
i++;
}
}
}).start();
new Thread(new Runnable() { @Override
public void run() {
while (true){
try {
Thread.sleep(2000);
System.out.println(queue.take().toString());
} catch (Exception e) {
e.printStackTrace();
} { }
} }
}).start();
}

LinkedTransferQueue

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列LinkedTransferQueue多了tryTransfer和transfer方法。

1. transfer(E e):若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并且等待进入阻塞状态,到有消费者线程取走该元素。
     2. tryTransfer(E e):若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。

LinkedBlockingDeque

LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列。所谓双向队列指的你可以从队列的两端插入和移出元素。双端队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。相比其他的阻塞队列,LinkedBlockingDeque多了addFirst,addLast,offerFirst,offerLast,peekFirst,peekLast等方法

java里面的队列的更多相关文章

  1. Java多线程 阻塞队列和并发集合

    转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的 ...

  2. Java 中的队列 Queue

    一.队列的定义 我们都知道队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列.Java中的Queue与List.Set属于同一个级别 ...

  3. java实现链队列

    java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next ...

  4. Java服务器端消息队列实战

    服务端口监听--报文接收--报文解码--业务处理--报文编码--写回客户端 从服务端与客户端成功握手并产生一个socket后,为了提高吞吐能力,接下来的事情就可以交给多线程去处理. 为了对接入的请求做 ...

  5. 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

  6. java中有界队列的饱和策略(reject policy)

    文章目录 AbortPolicy DiscardPolicy DiscardOldestPolicy CallerRunsPolicy 使用Semaphore java中有界队列的饱和策略(rejec ...

  7. Java集合--阻塞队列及各种实现的解析

    阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...

  8. Java:阻塞队列

    Java:阻塞队列 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. 概述 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 B ...

  9. java代码实现队列的优化

    package com.voole.queun; /** * @Decription 队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列 ...

  10. Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用

    Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...

随机推荐

  1. PL/SQL Developer使用技巧、快捷键(转发)

    转发自:https://www.cnblogs.com/linjiqin/archive/2013/06/24/3152538.html PL/SQL Developer使用技巧.快捷键 1.类SQL ...

  2. How to use shared model by git in sql source control of red gate

    1.clone the git repository for datbase 2.open sql source control window and select the target databa ...

  3. Android 6.0 中TimePicker显示为滚动样式的方法

    在Android6.0中,TimePicker控件的默认样式为转盘的样式,就像这个样子: 如果想要显示为之前的滚动样式的话也很简单,只要在布局文件中设置TimePicker的timePickerMod ...

  4. 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图)

    P1894 [USACO4.2]完美的牛栏The Perfect Stall 题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星 ...

  5. bzoj3297[USACO2011 Open]forgot(dp + string)

    3297: [USACO2011 Open]forgot Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 137  Solved: 94[Submit] ...

  6. layui日期输入框

    <div class="layui-form-item">                <label class="layui-form-label& ...

  7. var的变量提升的底层原理是什么?

    原理:JS引擎的工作方式是①先解析代码,获取所有被声明的变量:②然后在运行.也就是专业来说是分为预处理和执行两个阶段. 变量提升的定义:所有变量的声明语句都会被提升到代码头部,这就是变量提升. 例如: ...

  8. I2C controller core之Bit controller(04)

    4) detect start/stop condition START- falling edge on SDA while SCL is high;  STOP -  rising edge on ...

  9. 怎么不让别人ping服务器

    频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进 行设置,也可以在路由器上进行设置,并且还可以利用Win ...

  10. 去除安卓apk中的广告

    一般来说,安卓应用很多免费的apk都是有广告的.尽管我们要坚持尊重开发者,帮帮他们点击广告赚钱来可持续发展,但是有的时候,很多游戏中游戏实在是太影响感觉了,当找不到汉化破解版本的时候,也许需要亲自把它 ...