多线程学习-队列
来源:互联网 发布:ant 运行java 编辑:程序博客网 时间:2024/06/07 10:20
1、常规队列
实现接口java.util.Queue,常用方法有offer、peek、poll等,分类:
1)LinkedList:常规队列,实现了接口List和Queue
2)PriorityQueue:有序列表,加入到队列中的元素,根据元素的天然排序或java.util.Comparator进行排序
public class PriorityQueueDemo {public static void main(String[] args) {//指定排序规则构造有序队列PriorityQueue<Object> q1 = new PriorityQueue<Object>(num, new Comparator<Object>() {@Overridepublic int compare(Object o1, Object o2) {return 0;}});//默认构造,使用天然排序PriorityQueue<Object> q2 = new PriorityQueue<Object>();}}
3)ConcurrentLinkedQueue:基于链接节点的、线程安全的队列,并发访问不需要同步
2、阻塞队列
实现接口java.util.concurrent.BlockingQueue,通过put添加数据,没有空间时阻塞,通过take获取数据,没有数据时阻塞
1)ArrayBlockingQueue:数组支持的有界队列
public class BlockingQueueDemo {private BlockingQueue<String> queue = new ArrayBlockingQueue<String>(num);public static void main(String[] args) {BlockingQueueDemo demo = new BlockingQueueDemo();Productor p = demo.new Productor();Consumer c = demo.new Consumer();p.start();c.start();}class Productor extends Thread{public void run(){try {//队列添加数据queue.put("...");} catch (InterruptedException e) {//异常处理}}}class Consumer extends Thread{public void run(){try {//从队列获取数据String str = queue.take();} catch (InterruptedException e) {//异常处理}}}}
2)LinkedBlockingQueue: 链表支持的可选有界队列,用法同ArrayBlockingQueue,只是后台存储方式不同
3)PriorityBlockingQueue:由优先级堆支持的无界优先级队列
4)DelayQueue:由优先级堆支持的、基于时间的调度队列,加入到队列中的元素必须实现新的Delayed接口,主要实现2个方法getDelay(TimeUnit unit)和compareTo(Delayed d),其中getDelay方法返回的值应该是动态的,如果值固定的话,是负值还好说,可以直接获取,如果是正值,获取数据时将一直阻塞,参照源码:
public E take() throws InterruptedException {final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {for (;;) {E first = q.peek();if (first == null) {available.await();} else {long delay = first.getDelay(TimeUnit.NANOSECONDS);if (delay > 0) {long tl = available.awaitNanos(delay);} else {E x = q.poll();assert x != null;if (q.size() != 0)available.signalAll(); // wake up other takersreturn x;}}}} finally {lock.unlock();}}
因为队列的大小没有界限,使得添加可以立即返回,但是在延迟时间过去之前,不能从队列中取出元素。如果多个元素完成了延迟,那么最早失效/失效时间最长的元素将第一个取出
5)SynchronousQueue:同步队列,每个插入操作必须等待另一个线程的对应移除操作,反之亦然。
- 多线程学习-队列
- Python学习----多线程处理工作队列
- 多线程---队列
- 多线程队列
- C++多线程编程学习三 [FIFO队列设计]
- C++多线程编程学习三 [FIFO队列设计]
- 多线程学习09-GCD的各种队列
- 多线程学习(九)-可阻塞的队列
- Tensorflow深度学习之十七:队列与多线程
- iOS-多线程编程学习之GCD——串行队列和并发队列(五)
- 一个多线程队列模型
- 多线程操作消息队列
- 消息队列 多线程 linux
- 循环队列,支持多线程
- windows 多线程 消息队列
- RingBuffer队列多线程应用
- java多线程 队列 BlockingQueue
- 多线程, 线程队列
- jsp的开始
- 20个HTML5/CSS3超酷应用
- JAVA线程同步锁机制分析 .
- Springmvc视频教程推荐
- Android4.3 user版本提权root
- 多线程学习-队列
- JBoss+Ant实现EJB无状态会话bean实例
- struts2中不同action之间进行传值的方法
- 写给我们这些浮躁的程序员
- 关于使用JAVA写外壳
- 终于有解了~~hadoop Does not contain a valid host:port authority: file:///
- autoscan automake 生成Makefile
- C++语言习题 求n阶勒让德多项式
- 在启动 Eclipse 时候,弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!