【Java基础】并发 - 多线程 - 阻塞队列
来源:互联网 发布:淘宝客加入条件 编辑:程序博客网 时间:2024/05/23 22:16
阻塞队列
阻塞队列与普通队列的区别在于:当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲下来。
线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素。
JDK中的阻塞队列
public interface BlockingQueue<E> extends Queue<E> (java.util.concurrent)
- ArrayBlockingQueue:由数组支持的有界阻塞队列,此队列按FIFO先进先出对元素排序;新元素查到队尾tail,retrieval操作返回对头head的元素;
- LinkedBlockingQueue:based on linked nodes。optionally-bounded。
- SynchronousQueue:同步队列;每个insert操作必须等待直到有另一个线程调用了remove操作,反之依然;
- PriorityBlockingQueue:
阻塞队列是线程安全的。
阻塞队列提供四种形式的方法:
- 不阻塞直接抛出异常;
- 返回特定值;
- 阻塞直到操作可继续执行;
- 阻塞给定的时间;
add(e)
offer(e)
put(e)
offer(e, time, unit)
Removeremove()
poll()
take()
poll(time, unit)
Examineelement()
peek()
not applicablenot applicable生产者-消费者
class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
阻塞队列的一个简单实现
public class BlockingQueue { private List queue = new LinkedList(); private int limit = 10; public BlockingQueue(int limit){ this.limit = limit; } public synchronized void enqueue(Object item) throws InterruptedException { while(this.queue.size() == this.limit) { wait(); } if(this.queue.size() == 0) { notifyAll(); } this.queue.add(item); } public synchronized Object dequeue() throws InterruptedException{ while(this.queue.size() == 0){ wait(); } if(this.queue.size() == this.limit){ notifyAll(); } return this.queue.remove(0); }}
0 0
- 【Java基础】并发 - 多线程 - 阻塞队列
- Java多线程 阻塞队列和并发集合
- Java多线程阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程 阻塞队列和并发集合
- Java多线程/并发26、阻塞队列BlockingQueue
- java并发-阻塞队列
- java多线程并发处理之阻塞队列LinkedBlockingQueue用法
- Java多线程中的阻塞队列和并发集合
- Java多线程——阻塞队列和并发集合
- Java多线程/并发21、利用Condition来实现阻塞队列
- HilbertCurve 希尔伯特遍历的递归实现
- linux SecureCRT ssh key认证登陆
- 《算法竞赛入门经典》上机练习——第一章
- iOS Foundation 框架中 Mutable 的类们
- 安装linux系统后,笔记本触摸板,那些让人蛋疼的事!
- 【Java基础】并发 - 多线程 - 阻塞队列
- java-内存管理
- 读书笔记-《如何阅读一本书》
- CSS定位之浮动
- Qt5 串口 usb
- 大数据:应用于计量学的新技巧 - 简介以及第一章 用来处理大数据的工具
- 大数据:应用于计量学的新技巧 - 第二章 用来分析大数据的工具
- 大数据:应用于计量学的新技巧 - 第三章 一般为预测需要做的考量
- Codechef Nuclear Reactors 题解