私はJava MEで単純なブロックキューを実装しようとしています。 JavaME APIでは、Java SEの並行性ユーティリティは利用できないため、以前のような待ち通知を使用する必要があります。JavaMEでブロッキングキューを実装する方法:最適化する方法
これは私の暫定的な実装です。私はnotifyAll
の代わりにnotify
を使用しています。私のプロジェクトでは複数のプロデューサが存在し、単一のコンシューマしかないからです。
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
で2つの操作を実行できますか?
その他の最適化は可能ですか?
EDIT:
@Raamが正しく指摘したように、消費者スレッドは、wait
で起床したときに餓死する可能性があります。では、これを防ぐための代替手段は何ですか? (注:JavaMEでは、Java SEのこれらの優れたクラスはありません。古いJava v1.2と考えてください)
代わりにbackport-concurrentライブラリ(http://backport-jsr166.sourceforge.net/)をお試しください。 – artbristol
ありがとうございますが、Java 1.2ではうまくテストされていません。また、私はあまりにも多くのクラスを必要としない、単純なキュー。 –
違反はありませんが、あなた自身のロールよりも優れたテストを受ける可能性があります。また、このcatch(InterruptedException e){} 'を実行しないでください。 http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – artbristol