java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...
[Java教程]【JAVA并發編程實戰】12、使用condition實現多線程下的有界緩存先進先出隊列
0 2016-11-29 17:00:10 package cn.study.concurrency.ch14;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 使用condition作為掛起線程的信號 * 這個是先進先出的隊列 * @author xiaof * * @param */public class ConditionBoundedBuffer { protected final Lock lock = new ReentrantLock(); //數據隊列長度 private static final int BUFFER_SIZE = 1024; //建立兩個condition,一個代表不為空,一個代表不滿 private final Condition notFull = lock.newCondition(); private final Condition notEmpty = lock.newCondition(); private final T[] items = (T[]) new Object[BUFFER_SIZE]; private int tail, head, count; public void put(T x) throws InterruptedException { lock.lock();//這里在進行操作的時候上鎖 try { while(count == items.length) { //如果是滿的就掛起線程,等待變為notFull notFull.await(); } items[tail] = x; //判斷是否是已經達到了滿隊列的情況 if(++tail == items.length) tail = 0; //計數值++ ++count; //插入數據,隊列肯定不是空的,那么進行非空信號發布 notEmpty.signal(); } finally{ //執行完畢,切記一定要解鎖 lock.unlock(); } } //獲取數據,阻塞直到隊列中有數據為止 public T take() throws InterruptedException { lock.lock();//進行操作之前,先上鎖 try { while(count == 0) { //如果隊列中沒有數據,那么就要進行現場掛起 notEmpty.await(); } //得到數據,用來返回 T t = items[head]; items[head] = null;//吧輸出出去的數據設為空 if(++head == items.length) head = 0; //重置隊里索引 --count; //計數減一 notFull.signal();//喚醒插入操作,因為獲取出去一個數據,那么隊列就一定有空位 return t; } finally { //切記在執行完畢之后,不論成功與否,都要解鎖 lock.unlock(); } } }
本文網址:http://www.shaoqun.com/a/266899.html
*特別聲明:以上內容來自于網絡收集,著作權屬原作者所有,如有侵權,請聯系我們:admin@shaoqun.com。
JAVA
0
總結
以上是生活随笔為你收集整理的java 多线程缓存_[Java教程]【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016年光伏电站交易和融资的十大猜想
- 下一篇: Linux基础