我正在尝试在 Java ME 中实现一个简单的阻塞队列。在 JavaME API 中,Java SE 的并发实用程序不可用,所以我不得不像过去一样使用等待通知。
这是我的临时实现。我使用notify
而不是notifyAll
因为在我的项目中有多个生产者但只有一个消费者。我故意使用一个对象来等待通知以提高可读性,尽管它浪费了一个参考:
import java.util.Vector;
public class BlockingQueue {
private Vector queue = new Vector();
private Object queueLock = new Object();
public void put(Object o){
synchronized(queueLock){
queue.addElement(o);
queueLock.notify();
}
}
public Object take(){
Object ret = null;
synchronized (queueLock) {
while (queue.isEmpty()){
try {
queueLock.wait();
} catch (InterruptedException e) {}
}
ret = queue.elementAt(0);
queue.removeElementAt(0);
}
return ret;
}
}
我的主要问题是关于put
方法。我可以把这queue.addElement
条线放在外面synchronized
吗?如果是这样,性能会提高吗?
此外,这同样适用于take
:我可以将这两个操作queue
排除在外synchronized block
吗?
还有其他可能的优化吗?
编辑:
正如@Raam 正确指出的那样,消费者线程在wait
. 那么有什么替代方法可以防止这种情况发生呢?(注意:在 JavaME 中,我没有来自 Java SE 的所有这些好类。把它想象成旧的 Java v1.2)