Jedyne, co mogę znaleźć, to BoundedFIFOBuffer, który jest przestarzały. Ktoś jeszcze?Czy istnieje zbiór nieblokujących kolekcji Java?
Odpowiedz
BoundedFIFOBuffer
w zbiorach Apache Commons (które, jak zakładam, jest to, do czego się odwołujesz) nie jest przestarzałe, właśnie przeniósł pakiety. Oryginalnym w org.apache.commons.collections
jest przestarzała, a zamiast tego została przeniesiona do org.apache.commons.collections.buffer
Istnieją pewne Ograniczone zbiory w Apache commons-collections, w tym BoundedFifoBuffer.
w tej samej bibliotece, jest również BoundedBuffer i CircularFifoBuffer
Dlaczego nie wystarczy użyć LinkedBlockingQueue
i użyć metod non-blocking offer
(lub add
) i poll
do niego dostęp? Możesz utworzyć go ze stałą wydajnością (tzn. Aby był ograniczony).
Kolejna dobra opcja. Dzięki. – Justin
Prawdopodobnie nie warto się tym martwić, ale LinkedBlockingQueue nadal będzie blokował. Przyszłe wersje hotspotu zapewne zoptymalizują to. Ale coś, o czym należy pamiętać, gdy później profilujesz. –
Ostatnio używałem Google Collections. Myślę, że z łatwością możesz mieć rozwiązanie Java Generics. Istnieje klasa o nazwie ForwardingList, która moim zdaniem mogłaby całkiem łatwo zrealizować ten pomysł. Oczywiście nie tak łatwe, jak po prostu przy użyciu BoundedFifoBuffer (nie generycznych) lub ArrayBlockingQueue.
final ArrayList<MyObject> realList = Lists.newArrayList();
final List<MyObject> list = new ForwardingList<MyObject>() {
protected List<MyObject> delegate() {
return realList;
}
public boolean add(MyObject obj) {
if(delegate().size() > 100) return false;
return delegate().add(obj);
}
};
Dzięki, jakoś wylądowałem na przestarzałej stronie. – Justin