【发布时间】:2012-04-26 08:38:30
【问题描述】:
我正在尝试在 Java ME 中实现一个简单的阻塞队列。在 JavaME API 中,Java SE 的并发工具不可用,所以我必须像过去一样使用 wait-notify。
这是我的临时实现。我使用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)
【问题讨论】:
-
您可以尝试使用反向端口并发库 (backport-jsr166.sourceforge.net) 吗?
-
谢谢,但它说在 Java 1.2 上没有经过很好的测试。另外我不需要这么多的类,只需要一个简单的队列。
-
无意冒犯,但它仍然可能比自己动手做更好的测试。另外,不要这样做
catch (InterruptedException e) {};见ibm.com/developerworks/java/library/j-jtp05236/index.html
标签: java java-me concurrency producer-consumer