在java生產者消費者專題---談談優化(二)中末尾指出notifyAll不能換成notify由於仍是可能出現死鎖,並無真正達到按需喚醒的目的,現使用Condition條件隊列進行優化,代碼以下:java
public class QueueWithCondition<T> extends BlockingQueue<T> {
private LinkedList<T> queue = new LinkedList<>();
private Lock lock = new ReentrantLock();
private Condition full = lock.newCondition();
private Condition empty = lock.newCondition();
private final int cacheSize;優化
public QueueWithCondition(int cacheSize) {
super();
this.cacheSize = cacheSize;
}this
public T take() {
try{
lock.lock();
while(true) {
if(queue.size()>0) {
boolean full = queue.size() == cacheSize;
T obj = queue.poll();
if(full) {
this.full.signal();
}
return obj;
}else {
try {
empty.await();
} catch (InterruptedException e) {
}
}
}
}finally {
lock.unlock();
}
}.net
public void put(T obj) {
try{
lock.lock();
while (true) {
if (queue.size() < cacheSize) {
boolean empty=queue.size()==0;
queue.offer(obj);
if(empty) {
this.empty.signal();
}
break;
} else {
try {
full.await();
} catch (InterruptedException e) {
}
}blog
}
}finally {
lock.unlock();
}隊列
}get
}it
改進後平均每秒消費消息72810個比原先每秒消費個數65541要快很多。io
使用Condition條件隊列能夠對不一樣的等待條件進行分區,這是wait、notify作不到的。class