Java ME で単純なブロッキング キューを実装しようとしています。JavaME API では、Java SE の並行ユーティリティが利用できないため、昔のように wait-notify を使用する必要があります。
これは私の暫定的な実装です。私のプロジェクトには複数のプロデューサーがあり、コンシューマーは 1 つしかないため、notify
代わりに使用しています。notifyAll
参照を無駄にしますが、読みやすさを向上させるために意図的に wait-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
からラインを出してもらえますか?synchronized
その場合、パフォーマンスは向上しますか?
また、同じことが にも当てはまりますtake
: から 2 つの操作を実行できqueue
ますsynchronized block
か?
他に可能な最適化はありますか?
編集:
@Raam が正しく指摘したように、コンシューマー スレッドは、wait
. では、これを防ぐための代替手段は何ですか?(注: JavaME には、Java SE からのこれらすべての優れたクラスはありません。古い Java v1.2 と考えてください)