Próbuję zaimplementować prostą blokującą kolejkę w Java ME. W JavaME API narzędzia współbieżności Java SE są niedostępne, więc muszę używać wait-notify jak w dawnych czasach.Implementowanie kolejki blokowania w JavaME: jak ją zoptymalizować?
To jest moja wstępna realizacja. Używam notify
zamiast notifyAll
, ponieważ w moim projekcie jest wielu producentów, ale tylko jeden konsument. Kiedyś obiekt do wyczekiwania zawiadomić celowo w celu poprawienia czytelności, mimo to traci odniesienie:
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;
}
}
Moje główne pytanie dotyczy sposobu put
. Czy mogę wstawić linię queue.addElement
z bloku synchronized
? Czy poprawi się wydajność, jeśli tak?
To samo dotyczy take
: czy mogę wykonać dwie operacje na queue
z synchronized block
?
Każda inna możliwa optymalizacja?
EDYCJA:
Jak słusznie zauważył @Raam, wątek konsumencki może głodować z głodu w trakcie budzenia w wait
. Więc jakie są alternatywy, aby temu zapobiec? (Uwaga: W JavaME nie mam wszystkich tych ładnych klas z Java SE.) Pomyśl o tym jako o starej Javie v1.2)
Czy możesz wypróbować zamiast tego równoległe biblioteki (http://backport-jsr166.sourceforge.net/)? – artbristol
Dzięki, ale nie jest dobrze przetestowany na Javie 1.2. Nie potrzebuję też wielu klas, tylko prostej kolejki. –
Bez urazy, ale nadal może być lepiej przetestowany niż samodzielny.Ponadto nie rób tego 'catch (InterruptedException e) {}'; zobacz http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html – artbristol