1. ConcurrentLinkedQueue

基础链表同步队列。

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; //底层链表实现 队列,先进先出
public class Test_03_ConcurrentLinkedQueue {
public static void main(String[] args) {
Queue<String> queue = new ConcurrentLinkedQueue<>();
for (int i = 0; i < 10; i++) {
queue.offer("value" + i);
}
System.out.println(queue);
System.out.println(queue.size()); //peek() 查看queue中的首数据
System.out.println(queue.peek());
System.out.println(queue.size()); //poll()->获取queue首数据
System.out.println(queue.poll());
System.out.println(queue.size());
}
}

   LinkedBlockingQueue

阻塞队列,队列容量不足自动阻塞,队列容量为 0 自动阻塞

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; /** 并发容器 - LinkedBlockingQueue
* 阻塞容器。
* put & take - 自动阻塞。
* put自动阻塞, 队列容量满后,自动阻塞
* take自动阻塞方法, 队列容量为0后,自动阻塞。
*/
public class Test_04_LinkBlockingQueue {
final BlockingQueue<String> queue = new LinkedBlockingQueue<>();
final Random r = new Random(); public static void main(String[] args) {
final Test_04_LinkBlockingQueue t = new Test_04_LinkBlockingQueue(); new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
t.queue.put("value"+t.r.nextInt(1000));
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "producer").start(); for(int i = 0; i < 3; i++){
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
System.out.println(Thread.currentThread().getName() +
" - " + t.queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "consumer"+i).start();
}
}
}

   ArrayBlockingQueue

底层数组实现的有界队列。自动阻塞。根据调用 API(add/put/offer)不同,有不同特 性。 当容量不足的时候,有阻塞能力。 add 方法在容量不足的时候,抛出异常。 put 方法在容量不足的时候,阻塞等待。 offer 方法, 单参数 offer 方法,不阻塞。容量不足的时候,返回 false。当前新增数据操作放弃。 三参数 offer 方法(offer(value,times,timeunit)),容量不足的时候,阻塞 times 时长(单 位为 timeunit),如果在阻塞时长内,有容量空闲,新增数据返回 true。如果阻塞时长范围 内,无容量空闲,放弃新增数据,返回 false

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit; public class Test_05_ArrayBlockingQueue {
//当容量不足的时候,有阻塞能力
//add 方法在容量不足的时候,抛出异常
//put 方法在容量不如的时候,阻塞等待
//offer 方法,单参数,容量不足的时候,返回false。当前新增数据操作放弃
//offer 三参数,容量不足的时候,阻塞times时长(单位为timeunit),如果在阻塞时长内,
//有容量空闲,新增数据返回true,如果阻塞时长范围内,无容量空闲,放弃新增数据,返回false final BlockingQueue<String> queue = new ArrayBlockingQueue<>(3); public static void main(String[] args) {
final Test_05_ArrayBlockingQueue t = new Test_05_ArrayBlockingQueue(); for (int i = 0; i < 5; i++) {
// System.out.println("add method : " + t.queue.add("value"+i));
/*
* try { t.queue.put("put"+i); } catch (InterruptedException e) {
* e.printStackTrace(); } System.out.println("put method : " + i);
*/
// System.out.println("offer method : " + t.queue.offer("value"+i));
try {
System.out.println("offer method : " + t.queue.offer("value" + i, 1, TimeUnit.SECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(t.queue);
}
}

  DelayQueue

延时队列。根据比较机制,实现自定义处理顺序的队列。常用于定时任务。 如:定时关机

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit; //有顺序有时间的排序
//延时队列,根据比较机制,实现自定义处理顺序的队列。常用于定时任务
public class Test_06_DelayQueue {
static BlockingQueue<MyTask_06> queue = new DelayQueue<>(); public static void main(String[] args) throws InterruptedException {
long value = System.currentTimeMillis();
MyTask_06 task1 = new MyTask_06(value + 2000);
MyTask_06 task2 = new MyTask_06(value + 1000);
MyTask_06 task3 = new MyTask_06(value + 3000);
MyTask_06 task4 = new MyTask_06(value + 2500);
MyTask_06 task5 = new MyTask_06(value + 1500); queue.put(task1);
queue.put(task2);
queue.put(task3);
queue.put(task4);
queue.put(task5); System.out.println(queue);
System.out.println(value);
for (int i = 0; i < 5; i++) {
System.out.println(queue.take());
}
}
} class MyTask_06 implements Delayed { private long compareValue; public MyTask_06(long compareValue) {
this.compareValue = compareValue;
} /**
* 比较大小。自动实现升序 建议和getDelay方法配合完成。
* 如果在DelayQueue是需要按时间完成的计划任务,必须配合getDelay方法完成。
*/
@Override
public int compareTo(Delayed o) {
return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
} /**
* 获取计划时长的方法。 根据参数TimeUnit来决定,如何返回结果值。
*/
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(compareValue - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
} @Override
public String toString() {
return "Task compare value is : " + this.compareValue;
}
}

   LinkedTransferQueue

转移队列,使用 transfer 方法,实现数据的即时处理。没有消费者,就阻塞

/**
* 并发容器 - LinkedTransferQueue
* 转移队列
* add - 队列会保存数据,不做阻塞等待。
* transfer - 是TransferQueue的特有方法。必须有消费者(take()方法的调用者)。
* 如果没有任意线程消费数据,transfer方法阻塞。一般用于处理即时消息。
*/
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TransferQueue; public class Test_07_TransferQueue {
TransferQueue<String> queue = new LinkedTransferQueue<>(); public static void main(String[] args) {
final Test_07_TransferQueue t = new Test_07_TransferQueue(); /*
* new Thread(new Runnable() {
*
* @Override public void run() { try {
* System.out.println(Thread.currentThread().getName() +
* " thread begin " );
* System.out.println(Thread.currentThread().getName() + " - " +
* t.queue.take()); } catch (InterruptedException e) {
* e.printStackTrace(); } } }, "output thread").start();
*
* try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) {
* e.printStackTrace(); }
*
* try { t.queue.transfer("test string"); } catch (InterruptedException
* e) { e.printStackTrace(); }
*/ new Thread(new Runnable() { @Override
public void run() {
try {
t.queue.transfer("test string");
// t.queue.add("test string");
System.out.println("add ok");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start(); try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
} new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " thread begin ");
System.out.println(Thread.currentThread().getName() + " - " + t.queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "output thread").start();
}
}

  SynchronusQueue

同步队列,是一个容量为 0 的队列。是一个特殊的 TransferQueue。 必须现有消费线程等待,才能使用的队列。 add 方法,无阻塞。若没有消费线程阻塞等待数据,则抛出异常。 put 方法,有阻塞。若没有消费线程阻塞等待数据,则阻塞

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit; public class Test_08_SynchronusQueue { BlockingQueue<String> queue = new SynchronousQueue<>(); public static void main(String[] args) {
final Test_08_SynchronusQueue t = new Test_08_SynchronusQueue(); new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " thread begin " );
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " - " + t.queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "output thread").start(); /*try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
// t.queue.add("test add");
try {
t.queue.put("test put");
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(Thread.currentThread().getName() + " queue size : " + t.queue.size());
} }

  

Java-Queue总结的更多相关文章

  1. atitit. java queue 队列体系and自定义基于数据库的队列总结o7t

    atitit. java queue 队列体系and自定义基于数据库的队列总结o7t 1. 阻塞队列和非阻塞队列 1 2. java.util.Queue接口, 1 3. ConcurrentLink ...

  2. java Queue中 add/offer,element/peek,remove/poll区别

    转自https://blog.csdn.net/u012050154/article/details/60572567 java Queue中 add/offer,element/peek,remov ...

  3. atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t

    atitit. java queue 队列体系and自己定义基于数据库的队列总结o7t 1. 堵塞队列和非堵塞队列 1 2. java.util.Queue接口. 1 3. ConcurrentLin ...

  4. 【Todo】Java Queue Stack Vector ArrayList

    Java集合框架里存在Queue这个接口,之后有不同类型的队列的实现. 有Stack这个类实现堆栈,其实这个类是通过继承Vector的方式来实现的, Vector和ArrayList的实现方式差不多, ...

  5. Java Queue之PriorityQueue

    PriorityQueue位于Java util包中,观其名字前半部分的单词Priority是优先的意思,实际上这个队列就是具有“优先级”.既然具有优先级的特性,那么就得有个前后排序的“规则”.所以其 ...

  6. # Java Queue系列之PriorityQueue

    在上一篇中我用一张图来梳理了一下Java中的各种Queue之间的关系.这里介绍下PriorityQueue.PriorityQueue位于Java util包中,观其名字前半部分的单词Priority ...

  7. java Queue

    队列是一个典型的先进先出(FIFO)的容器,即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的,队列常常被当作一种可靠的对象从程序的某个区域传输到另一个区域,队列在并发编 ...

  8. Java Queue 专题

    关于java中的Queue,经常用到,做个总结 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约. (Java中的集合包括三 ...

  9. 数据结构——java Queue类

    定义 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用 图例 Que ...

  10. Java Queue 队列

    队列是一种先进先出的数据结构,队列中插入元素和删除元素分别位于队列的两端. 在Java中 队列实现类众多,本文不再赘述.本文探讨的是如何自定义队列实现类: 基于数组方式实现队列: 注意点: 当出队时队 ...

随机推荐

  1. PMP备考-第二章-项目运行环境与项目经理

    组织系统的三大因素:组织治理框架,管理要素和组织结构 组织治理和项目治理 组织治理 :组织中的重要决策制定框架,谁有权在什么时候用什么发放做出并推行什么重要决策. 项目治理 :组织为项目建立的高级别的 ...

  2. Java使用MD5加盐进行加密

    Java使用MD5加盐进行加密    我使用的方法是导入了md5.jar包,就不需要再自己写MD5的加密算法了,直接调用方法即可 点击下载md5包 import com.ndktools.javamd ...

  3. JDBC及C3P0常用类

    JDBC(Java Database Connectivity)JAVA数据库连接,它是一套用于执行SQL语句的Java API.JDBC可以通过不同驱动与不同数据库连接,相当于JAVA和数据库之间的 ...

  4. Nginx配置文件nginx.conf(八)

    原文链接:https://www.cnblogs.com/knowledgesea/p/5175711.html 在nginx.conf的注释符号是#. 默认的nginx.conf内容为: #user ...

  5. Mrmr:

    Feature selection: minimum redundancy and maximum relevance feature selection for high-dimensional d ...

  6. requests--超时设置,代理设置,身份认证

    超时设置 你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应.基本上所有的接口都应该使用这一参数.如果不使用,你的程序可能会永远失去响应 import requ ...

  7. Zabbix介绍及安装

    Zabbix简介 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件,是一个企业级的分布式开源监控方案.Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警.这样 ...

  8. [HNOI2012]集合选数(构造,状态压缩,DP)

    神仙题. 莫名其妙的就试一试把所有数放进一个类似矩阵的东西里面. 首先把 \(1\) 放到左上角,然后在每个数的右边放它的 \(3\) 倍(大于 \(n\) 就不用放了),下面放它的 \(2\) 倍( ...

  9. Linux性能优化实战学习笔记:第二十四讲

    一.磁盘 1.机械磁盘 2.固态磁盘 3.相同磁盘随机I/O比连续I/O慢很多 4.最小单位 5.接口 6.RAID陈列卡 7.网路存储 二.通用块层 1.概念 2.第一功能 3.第二功能 4.I/O ...

  10. Linux性能优化实战学习笔记:第五十四讲

    一.上节回顾 上一节,我带你学习了,如何使用 USE 法来监控系统的性能,先简单回顾一下. 系统监控的核心是资源的使用情况,这既包括 CPU.内存.磁盘.文件系统.网络等硬件资源,也包括文件描述符数. ...