我想在Java ME中實現一個簡單的阻塞隊列。在JavaME API中,Java SE的併發實用程序不可用,所以我必須像以前一樣使用wait-notify。在JavaME中實現阻塞隊列:如何優化它?
這是我的臨時實施。我使用的是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
行從塊中刪除嗎?如果是,性能會提高嗎?
此外,同樣適用於take
:我可以在synchronized block
以外的queue
兩個操作?
任何其他可能的優化?
編輯:
作爲@Raam正確地指出,消費者線程可以在wait
被吵醒時餓死。那麼有什麼辦法可以防止呢? (注意:在JavaME中,我沒有Java SE提供的所有這些很好的類,可以將其視爲舊的Java v1.2)
你可以嘗試backport併發庫,而不是(http://backport-jsr166.sourceforge.net/)? – artbristol 2012-04-26 08:52:41
謝謝,但它說在Java 1.2上沒有很好的測試。另外我不需要這麼多的類,只是一個簡單的隊列。 – 2012-04-26 09:04:31
沒有冒犯,但它仍然可能比自己動手更好的測試。另外,不要這樣做catch(InterruptedException e){}';請參閱http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – artbristol 2012-04-26 09:42:00